mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Fix dmu_tx_dirty_throttle after arc_c reduction
After initial arc_c was reduced to arc_c_min it became possible that on datasets with primarycache=metadata or none dirty data make up most of ARC capacity and easily more than configured 50% of initial arc_c, that causes forced txg commits by arc_tempreserve_space() and periodic very long write delays. This patch makes arc_tempreserve_space() to use arc_c only after ARC warmed up once and arc_c really means something, but use arc_c_max before that. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Matt Macy <mmacy@FreeBSD.org> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored-By: iXsystems, Inc. Closes #11178
This commit is contained in:
		
							parent
							
								
									b49118220c
								
							
						
					
					
						commit
						050dfc5045
					
				@ -7070,9 +7070,9 @@ arc_tempreserve_space(spa_t *spa, uint64_t reserve, uint64_t txg)
 | 
			
		||||
	 */
 | 
			
		||||
	uint64_t total_dirty = reserve + arc_tempreserve + anon_size;
 | 
			
		||||
	uint64_t spa_dirty_anon = spa_dirty_data(spa);
 | 
			
		||||
 | 
			
		||||
	if (total_dirty > arc_c * zfs_arc_dirty_limit_percent / 100 &&
 | 
			
		||||
	    anon_size > arc_c * zfs_arc_anon_limit_percent / 100 &&
 | 
			
		||||
	uint64_t rarc_c = arc_warm ? arc_c : arc_c_max;
 | 
			
		||||
	if (total_dirty > rarc_c * zfs_arc_dirty_limit_percent / 100 &&
 | 
			
		||||
	    anon_size > rarc_c * zfs_arc_anon_limit_percent / 100 &&
 | 
			
		||||
	    spa_dirty_anon > anon_size * zfs_arc_pool_dirty_percent / 100) {
 | 
			
		||||
#ifdef ZFS_DEBUG
 | 
			
		||||
		uint64_t meta_esize = zfs_refcount_count(
 | 
			
		||||
@ -7080,9 +7080,9 @@ arc_tempreserve_space(spa_t *spa, uint64_t reserve, uint64_t txg)
 | 
			
		||||
		uint64_t data_esize =
 | 
			
		||||
		    zfs_refcount_count(&arc_anon->arcs_esize[ARC_BUFC_DATA]);
 | 
			
		||||
		dprintf("failing, arc_tempreserve=%lluK anon_meta=%lluK "
 | 
			
		||||
		    "anon_data=%lluK tempreserve=%lluK arc_c=%lluK\n",
 | 
			
		||||
		    "anon_data=%lluK tempreserve=%lluK rarc_c=%lluK\n",
 | 
			
		||||
		    arc_tempreserve >> 10, meta_esize >> 10,
 | 
			
		||||
		    data_esize >> 10, reserve >> 10, arc_c >> 10);
 | 
			
		||||
		    data_esize >> 10, reserve >> 10, rarc_c >> 10);
 | 
			
		||||
#endif
 | 
			
		||||
		DMU_TX_STAT_BUMP(dmu_tx_dirty_throttle);
 | 
			
		||||
		return (SET_ERROR(ERESTART));
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user