Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Nov 2013 16:11:09 +0400
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        Alexander Motin <mav@FreeBSD.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r258336 - head/sys/vm
Message-ID:  <20131119121109.GG7577@FreeBSD.org>
In-Reply-To: <201311191005.rAJA5snM048103@svn.freebsd.org>
References:  <201311191005.rAJA5snM048103@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
  Alexander,

On Tue, Nov 19, 2013 at 10:05:53AM +0000, Alexander Motin wrote:
A> Author: mav
A> Date: Tue Nov 19 10:05:53 2013
A> New Revision: 258336
A> URL: http://svnweb.freebsd.org/changeset/base/258336
A> 
A> Log:
A>   Implement soft pressure on UMA cache bucket sizes.
A>   
A>   Every time system detects low memory condition decrease bucket sizes for
A>   each zone by one item.  As result, higher memory pressure will push to
A>   smaller bucket sizes and so smaller per-CPU caches and so more efficient
A>   memory use.
A>   
A>   Before this change there was no force to oppose buckets growth as result
A>   of practically inevitable zone lock conflicts, and after some run time
A>   per-CPU caches could consume enough RAM to kill the system.

Brief review of patch tells me that system never recovers from this. uz_count
it decremented only and never incremented.

A> Modified:
A>   head/sys/vm/uma_core.c
A>   head/sys/vm/uma_int.h
A> 
A> Modified: head/sys/vm/uma_core.c
A> ==============================================================================
A> --- head/sys/vm/uma_core.c	Tue Nov 19 09:35:20 2013	(r258335)
A> +++ head/sys/vm/uma_core.c	Tue Nov 19 10:05:53 2013	(r258336)
A> @@ -701,6 +701,13 @@ bucket_cache_drain(uma_zone_t zone)
A>  		bucket_free(zone, bucket, NULL);
A>  		ZONE_LOCK(zone);
A>  	}
A> +
A> +	/*
A> +	 * Shrink further bucket sizes.  Price of single zone lock collision
A> +	 * is probably lower then price of global cache drain.
A> +	 */
A> +	if (zone->uz_count > zone->uz_count_min)
A> +		zone->uz_count--;
A>  }
A>  
A>  static void
A> @@ -1461,6 +1468,7 @@ zone_ctor(void *mem, int size, void *uda
A>  	zone->uz_fails = 0;
A>  	zone->uz_sleeps = 0;
A>  	zone->uz_count = 0;
A> +	zone->uz_count_min = 0;
A>  	zone->uz_flags = 0;
A>  	zone->uz_warning = NULL;
A>  	timevalclear(&zone->uz_ratecheck);
A> @@ -1552,6 +1560,7 @@ out:
A>  		zone->uz_count = bucket_select(zone->uz_size);
A>  	else
A>  		zone->uz_count = BUCKET_MAX;
A> +	zone->uz_count_min = zone->uz_count;
A>  
A>  	return (0);
A>  }
A> 
A> Modified: head/sys/vm/uma_int.h
A> ==============================================================================
A> --- head/sys/vm/uma_int.h	Tue Nov 19 09:35:20 2013	(r258335)
A> +++ head/sys/vm/uma_int.h	Tue Nov 19 10:05:53 2013	(r258336)
A> @@ -300,7 +300,8 @@ struct uma_zone {
A>  	volatile u_long	uz_fails;	/* Total number of alloc failures */
A>  	volatile u_long	uz_frees;	/* Total number of frees */
A>  	uint64_t	uz_sleeps;	/* Total number of alloc sleeps */
A> -	uint16_t	uz_count;	/* Highest amount of items in bucket */
A> +	uint16_t	uz_count;	/* Amount of items in full bucket */
A> +	uint16_t	uz_count_min;	/* Minimal amount of items there */
A>  
A>  	/* The next three fields are used to print a rate-limited warnings. */
A>  	const char	*uz_warning;	/* Warning to print on failure */

-- 
Totus tuus, Glebius.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20131119121109.GG7577>