Commit 9b2cd506 authored by Christoph Lameter's avatar Christoph Lameter Committed by Pekka Enberg

slub: Calculate min_objects based on number of processors.

The mininum objects per slab is calculated based on the number of processors
that may come online.

Processors    min_objects
---------------------------
1             8
2             12
4             16
8             20
16            24
32            28
64            32
1024          48
4096          56

The higher the number of processors the large the order sizes used for various
slab caches will become. This has been shown to address the performance issues
in hackbench on 16p etc.

The calculation is only performed if slub_min_objects is zero (default). If one
specifies a slub_min_objects on boot then that setting is taken.

As suggested by Zhang Yanmin's performance tests on 16-core Tigerton, use the
formula '4 * (fls(nr_cpu_ids) + 1)':

  ./hackbench 100 process 2000:

  1) 2.6.25-rc6slab: 23.5 seconds
  2) 2.6.25-rc7SLUB+slub_min_objects=20: 31 seconds
  3) 2.6.25-rc7SLUB+slub_min_objects=24: 23.5 seconds
Signed-off-by: default avatarChristoph Lameter <clameter@sgi.com>
Signed-off-by: default avatarZhang Yanmin <yanmin.zhang@intel.com>
Signed-off-by: default avatarPekka Enberg <penberg@cs.helsinki.fi>
parent 114e9e89
...@@ -1803,7 +1803,7 @@ static struct page *get_object_page(const void *x) ...@@ -1803,7 +1803,7 @@ static struct page *get_object_page(const void *x)
*/ */
static int slub_min_order; static int slub_min_order;
static int slub_max_order = PAGE_ALLOC_COSTLY_ORDER; static int slub_max_order = PAGE_ALLOC_COSTLY_ORDER;
static int slub_min_objects = 4; static int slub_min_objects;
/* /*
* Merge control. If this is set then no merging of slab caches will occur. * Merge control. If this is set then no merging of slab caches will occur.
...@@ -1880,6 +1880,8 @@ static inline int calculate_order(int size) ...@@ -1880,6 +1880,8 @@ static inline int calculate_order(int size)
* we reduce the minimum objects required in a slab. * we reduce the minimum objects required in a slab.
*/ */
min_objects = slub_min_objects; min_objects = slub_min_objects;
if (!min_objects)
min_objects = 4 * (fls(nr_cpu_ids) + 1);
while (min_objects > 1) { while (min_objects > 1) {
fraction = 8; fraction = 8;
while (fraction >= 4) { while (fraction >= 4) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment