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:
parent
becc31dda7
commit
a3fcc7c48b
|
@ -5478,11 +5478,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);
|
||||||
|
|
Loading…
Reference in New Issue