On 12/21/2014 02:53 PM, Charles Cazabon wrote:
Hi, Robert,

My performance issues with btrfs are more-or-less resolved now -- the
performance under btrfs still seems quite variable compared to other
filesystems -- my rsync speed is now varying between 40MB and ~90MB/s, with
occasional intervals where it drops further, down into the 10-20MB/s range.
Still no disk errors or SMART warnings that would indicate that problem is at
the hardware level.

Do make sure you are regularly running the long "offline" test.

Ok, I'll do that.

Otherwise SMART is just going to tell you the disk just died when it dies.

Ya, I'm aware of how limited/useful the SMART diagnostics are.  I'm also
paranoid enough to be using RAID 6...

The thing with "movablecore=" will not lead to an "out of memory"
condition or not, its a question of cache and buffer evictions.

I'm fairly certain memory isn't the issue here.  For what it's worth:

%Cpu(s):  2.1 us, 19.4 sy,  0.0 ni, 78.0 id,  0.2 wa,  0.3 hi,  0.0 si,  0.0 st
KiB Mem:  16469880 total, 16301252 used,   168628 free,      720 buffers
KiB Swap:  7811068 total,        0 used,  7811068 free, 15146580 cached

Swappiness I've left at the default of 60, but I'm not seeing swapping going
on regardless.

Swappiness has nothing to do with swapping.

You have very little free memory.

Here is how a linux system runs a program. When exec() is called the current process memory is wiped (dropped, forgotten, whatever) [except for a few things like the open file discriptor table]. Then the executable is opened and mmap() is called to map the text portions of that executable into memory. This does not involve any particular reading of that file. The dynamic linker also selectively mmap()s the needed libraries. So you end up with something that looks like this:

[+.....................]

Most of the program is not actually in memory. (the "." parts), and some minimum part is in memory (the "+" part).

As you use the program more of it will work its way into memory.

[+++.....+.+....++....]

swappiness controls the likelihood that memory pressure will cause parts that have been read in to be "forgotten" based on the idea that it can be read again later if needed.

[+++.....+.+....++....]
[+.......+......+.....]

This is called "demand paging", and because linux uses ELF (extensible link format) and all programs run in a uniform memory map, program text _never_ needs to be written to swap space. Windows DLL/EXE has to "relocate" the code, e.g. re-write it to make it runable. So on windows code text has to be paged to swap.

So what is "swapping" and swap space for?

Well next to the code is the data.

[+++.....+.+....++....] {.............}

As it gets written to, it cannot just be forgotten because the program needs that data or it wouldn't have written it.

[+++.....+.+....++....] {..******.*...}

So if the system needs to reclaim the memory used by that kind of data it sends it to the swap space.

[+++.....+.+....++....] {..******.*...}
                      ^^^^ swapping vvvv
[+++.....+.+....++....] {..**...*.*...}


Swappiness is how you tel the system that you want to keep the code ("+") in memory in favor of the data ("*").

But _long_ before you start having to actually write the data to disk in the swap space, the operating system will start casually forgetting the code. Most of both of these things, while "freshly forgotten" can be "reclaimed" from the disk/page cache.

So when you show me that free memory listing what I see is someone who is bumping against their "minimum desired free memory" limit (e.g. about 1% free ram) and so has a system where it's _possible_ that a good bit of stuff is getting dumped out of the active page tables and into the disk/page cache where it could start bogging down the system in large numbers of short reclaim delays and potentially non-trivial amounts of demand paging.

So not "out of memory" but not ideal. Real measurements of page fault activity and wait for io time needs to be done to determine if more action needs to be taken.

Compare that to my laptop where I've deliberately made sure that memory is always available for fast transient use.

Gust ~ # free
total used free shared buff/cache available Mem: 7915804 2820368 2419300 47472 2676136 4790892
Swap:       8778748      311688     8467060


In this configuration when I run bursty stuff I've set aside two gig that sits around "Free" into which the dynamic load can find ample space. (I am not recommending that for you necessarily, were I present I'd do some experimenting). But that dynamic space is where the rsync would be doing its work and so be less likely to stall. (Etc).


--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to