Extremely low disk throughput under high compute load

Stefan Esser se at freebsd.org
Sun Apr 1 22:19:11 UTC 2018


Am 01.04.18 um 18:33 schrieb Warner Losh:
> 
> 
> On Sun, Apr 1, 2018 at 9:18 AM, Stefan Esser <se at freebsd.org
> <mailto:se at freebsd.org>> wrote:
> 
>     My i7-2600K based system with 24 GB RAM was in the midst of a buildworld -j8
>     (starting from a clean state) which caused a load average of 12 for more than
>     1 hour, when I decided to move a directory structure holding some 10 GB to its
>     own ZFS file system. File sizes varied, but were mostly in the range 0f 500KB.
> 
>     I had just thrown away /usr/obj, but /usr/src was cached in ARC and thus there
>     was nearly no disk activity caused by the buildworld.
> 
>     The copying proceeded at a rate of at most 10 MB/s, but most of the time less
>     than 100 KB/s were transferred. The "cp" process had a PRIO of 20 and thus a
>     much better priority than the compute bound compiler processes, but it got
>     just 0.2% to 0.5% of 1 CPU core. Apparently, the copy process was scheduled
>     at such a low rate, that it only managed to issue a few controller writes per
>     second.
> 
>     The system is healthy and does not show any problems or anomalies under
>     normal use (e.g., file copies are fast, without the high compute load).
> 
>     This was with SCHED_ULE on a -CURRENT without WITNESS or malloc debugging.
> 
>     Is this a regression in -CURRENT?
> 
> Does 'sync' push a lot of I/O to the disk?

Each sync takes 0.7 to 1.5 seconds to complete, but since reading is so
slow, not much is written.

Normal gstat output for the 3 drives the RAIDZ1 consists of:

dT: 1.002s  w: 1.000s
 L(q)  ops/s    r/s   kBps   ms/r    w/s   kBps   ms/w   %busy Name
    0      2      2     84   39.1      0      0    0.0    7.8  ada0
    0      4      4     92   66.6      0      0    0.0   26.6  ada1
    0      6      6    259   66.9      0      0    0.0   36.2  ada3
dT: 1.058s  w: 1.000s
 L(q)  ops/s    r/s   kBps   ms/r    w/s   kBps   ms/w   %busy Name
    0      1      1     60   70.6      0      0    0.0    6.7  ada0
    0      3      3     68   71.3      0      0    0.0   20.2  ada1
    0      6      6    242   65.5      0      0    0.0   28.8  ada3
dT: 1.002s  w: 1.000s
 L(q)  ops/s    r/s   kBps   ms/r    w/s   kBps   ms/w   %busy Name
    0      5      5    192   44.8      0      0    0.0   22.4  ada0
    0      6      6    160   61.9      0      0    0.0   26.5  ada1
    0      6      6    172   43.7      0      0    0.0   26.2  ada3

This includes the copy process and the reads caused by "make -j 8 world"
(but I assume that all the source files are already cached in ARC).

During sync:

dT: 1.002s  w: 1.000s
 L(q)  ops/s    r/s   kBps   ms/r    w/s   kBps   ms/w   %busy Name
    1    101      9    132   14.6     90   1760    5.6   59.7  ada0
    2    110     16    267   15.0     92   1756    6.0   50.7  ada1
    2     82     13    291   17.8     67   1653    7.4   34.3  ada3

ZFS is configured to flush dirty buffers after 5 seconds, so there are
not many dirty buffers in RAM at any time, anyway.

> Is the effective throughput of CP tiny or large? It's tiny, if I read right,
> and the I/O is slow (as opposed to it all buffering in memory and being slow
> to drain own), right?

Yes, reading is very slow, with less than 10 read operations scheduled
per second.

Top output taken at the same time as above gstat samples:

last pid: 24306;  load averages: 12.07, 11.51,  8.13

                      up 2+05:41:57  00:10:22
132 processes: 10 running, 122 sleeping
CPU: 98.2% user,  0.0% nice,  1.7% system,  0.1% interrupt,  0.0% idle
Mem: 1069M Active, 1411M Inact, 269M Laundry, 20G Wired, 1076M Free
ARC: 16G Total, 1234M MFU, 14G MRU, 83M Anon, 201M Header, 786M Other
     14G Compressed, 30G Uncompressed, 2.09:1 Ratio
Swap: 24G Total, 533M Used, 23G Free, 2% Inuse

  PID USERNAME       THR PRI NICE   SIZE    RES STATE   C   TIME    WCPU COMMAND
24284 root             1  92    0   228M   199M CPU6    6   0:11 101.34% c++
24287 root             1  91    0   269M   241M CPU3    3   0:10 101.32% c++
24266 root             1  97    0   303M   276M CPU0    0   0:17 101.13% c++
24297 root             1  85    0   213M   184M CPU1    1   0:06  98.40% c++
24281 root             1  93    0   245M   217M CPU7    7   0:12  96.76% c++
24300 root             1  76    0   114M 89268K RUN     2   0:02  83.22% c++
24303 root             1  75    0   105M 79908K CPU4    4   0:01  59.94% c++
24302 root             1  52    0 74940K 47264K wait    4   0:00   0.35% c++
24299 root             1  52    0 74960K 47268K wait    2   0:00   0.33% c++
20954 root             1  20    0 15528K  4900K zio->i  3   0:02   0.11% cp

ARC is limited to 18 GB to leave 6 GB RAM for use by kernel and user programs.

vfs.zfs.arc_meta_limit: 4500000000
vfs.zfs.arc_free_target: 42339
vfs.zfs.compressed_arc_enabled: 1
vfs.zfs.arc_grow_retry: 60
vfs.zfs.arc_shrink_shift: 7
vfs.zfs.arc_average_blocksize: 8192
vfs.zfs.arc_no_grow_shift: 5
vfs.zfs.arc_min: 2250000000
vfs.zfs.arc_max: 18000000000

Regards, STefan


More information about the freebsd-current mailing list