Waiman Long wrote:
> --- a/include/linux/memcontrol.h
> +++ b/include/linux/memcontrol.h
> @@ -328,8 +328,14 @@ struct mem_cgroup {
> * size of first charge trial.
> * TODO: maybe necessary to use big numbers in big irons or dynamic based of
> the
> * workload.
> + *
> + * There are 3 common base page sizes - 4k, 16k & 64k. In order to limit the
> + * amount of memory that can be hidden in each percpu memcg_stock for a given
> + * memcg, we scale down MEMCG_CHARGE_BATCH by 2 for 16k and 4 for 64k.
> */
> -#define MEMCG_CHARGE_BATCH 64U
> +#define MEMCG_CHARGE_BATCH_BASE 64U
> +#define MEMCG_CHARGE_BATCH_SHIFT ((PAGE_SHIFT <= 16) ? (PAGE_SHIFT - 12)/2 :
> 2)
> +#define MEMCG_CHARGE_BATCH (MEMCG_CHARGE_BATCH_BASE >>
> MEMCG_CHARGE_BATCH_SHIFT)
This is a good complement to the first patch. With this change,
I got a chart to compare the three methods (linear, log2, sqrt)
in the count threshold:
4k page size (BATCH=64):
CPUs linear log2 sqrt
--------------------------------
1 256KB 256KB 256KB
8 2MB 1MB 512KB
128 32MB 2MB 2.75MB
1024 256MB 2.75MB 8MB
64k page size (BATCH=16):
CPUs linear log2 sqrt
-------------------------------
1 1MB 1MB 1MB
8 8MB 4MB 2MB
128 128MB 8MB 11MB
1024 1GB 11MB 32MB
Both are huge improvements.
log2 flushes more aggressively on large systems, which gives more accurate
stats but at the cost of more frequent synchronous flushes.
sqrt is more conservative, still a massive reduction from linear but gives
more breathing room on large systems, which may be better for performance.
I would leave this choice to you, Waiman, and the data is for reference.
--
Regards,
Li Wang