Fix zfs_dirty_data_max overflow on 32-bit

On 32 bit, the calculation of zfs_dirty_data_max from phymem will overflow,
causing it to be smaller than zfs_dirty_data_sync, and will cause txg being
delayed while no one write to disk. The end result is horrendous write speed.

On 4G ram 32-bit VM, before this patch, simple dd results in ~7MB/s. Now it
can reach speed on par with 64-bit VM.

Signed-off-by: Chunwei Chen <tuxoko@gmail.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #3973
This commit is contained in:
tuxoko 2015-10-30 16:10:01 -07:00 committed by Brian Behlendorf
parent d0c614ecf9
commit 43518d92fd

View File

@ -5479,11 +5479,11 @@ arc_init(void)
* zfs_dirty_data_max_max (default 25% of physical memory). * zfs_dirty_data_max_max (default 25% of physical memory).
*/ */
if (zfs_dirty_data_max_max == 0) if (zfs_dirty_data_max_max == 0)
zfs_dirty_data_max_max = physmem * PAGESIZE * zfs_dirty_data_max_max = (uint64_t)physmem * PAGESIZE *
zfs_dirty_data_max_max_percent / 100; zfs_dirty_data_max_max_percent / 100;
if (zfs_dirty_data_max == 0) { if (zfs_dirty_data_max == 0) {
zfs_dirty_data_max = physmem * PAGESIZE * zfs_dirty_data_max = (uint64_t)physmem * PAGESIZE *
zfs_dirty_data_max_percent / 100; zfs_dirty_data_max_percent / 100;
zfs_dirty_data_max = MIN(zfs_dirty_data_max, zfs_dirty_data_max = MIN(zfs_dirty_data_max,
zfs_dirty_data_max_max); zfs_dirty_data_max_max);