Skip to content

SLUB with queueing (V2) beats SLAB netperf TCP_RR

Christoph Lameter linux-mm lkml 1 version Applied

Status from this message: Applied, thanks!

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest19 patches 24 repliesApplied

Patches in v1 Applied

#Subject and filesSizeRepliesApplied
1/19Bugfix for semop() not reporting successful operationipc/sem.c+30 -60 replies
2/19percpu: make @dyn_size always mean min dyn_size in first chunk init functionsinclude/linux/percpu.h mm/percpu.c+11 -310 replies
3/19percpu: allow limited allocation before slab is onlineinclude/linux/percpu.h init/main.c mm/percpu.c+54 -120 replies
4/19slub: Use a constant for a unspecified node.mm/slub.c+7 -70 replies
5/19SLUB: Constants need ULmm/slub.c+2 -20 replies
6/19slub: Check kasprintf results in kmem_cache_init()mm/slub.c+6 -31 reply
7/19slub: Allow removal of slab caches during bootmm/slub.c+7 -06 replies
8/19slub: Use kmem_cache flags to detect if slab is in debugging mode.include/linux/page-flags.h mm/slub.c+12 -230 replies
9/19slub: discard_slab_unlockmm/slub.c+10 -60 replies
10/19slub: remove dynamic dma slab allocationmm/slub.c+40 -1110 replies
11/19slub: Remove static kmem_cache_cpu array for bootmm/slub.c+4 -130 replies
12/19slub: Dynamically size kmalloc cache allocationsinclude/linux/slub_def.h mm/slub.c+139 -490 replies
13/19slub: Extract hooks for memory checkers from hotpathsmm/slub.c+38 -110 replies
14/19slub: Move gfpflag masking out of the hotpathmm/slub.c+3 -20 replies
15/19SLUB: Add SLAB style per cpu queueinginclude/linux/page-flags.h include/linux/slub_def.h init/Kconfig +1 more+436 -5620 replies
16/19slub: Resize the new cpu queuesinclude/linux/slub_def.h mm/slub.c+177 -290 replies
17/19SLUB: Get rid of useless function count_free()mm/slub.c+3 -80 replies
18/19SLUB: Remove MAX_OBJS limitationinclude/linux/mm_types.h mm/slub.c+1 -110 replies
19/19slub: Drop allocator announcementmm/slub.c+0 -80 replies

Reviews trailers per patch

5 of 19 patches have a Reviewed-by or Acked-by.

PatchDavid Rientjes
1/19
2/19A-b
3/19
4/19
5/19A-b
6/19A-b
7/19A-b
8/19A-b
9/19
10/19
11/19
12/19
13/19
14/19
15/19
16/19
17/19
18/19
19/19

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v1 thread

Cover letter [S+Q2 00/19] SLUB with queueing (V2) beats SLAB netperf TCP_RR

The following patchset cleans some pieces up and then equips SLUB with per cpu queues that work similar to SLABs queues. With that approach SLUB wins significantly in hackbench and improves also on tcp_rr.

Hackbench test script:

#!/bin/bash
uname -a
echo "./hackbench 100 process 200000"
./hackbench 100 process 200000
echo "./hackbench 100 process 20000"
./hackbench 100 process 20000
echo "./hackbench 100 process 20000"
./hackbench 100 process 20000
echo "./hackbench 100 process 20000"
./hackbench 100 process 20000
echo "./hackbench 10 process 20000"
./hackbench 10 process 20000
echo "./hackbench 10 process 20000"
./hackbench 10 process 20000
echo "./hackbench 10 process 20000"
./hackbench 10 process 20000
echo "./hackbench 1 process 20000"
./hackbench 1 process 20000
echo "./hackbench 1 process 20000"
./hackbench 1 process 20000
echo "./hackbench 1 process 20000"
./hackbench 1 process 20000

Dell Dual Quad Penryn on Linux 2.6.35-rc3
Time measurements: Smaller is better:

Procs NR SLAB SLUB SLUB+Queuing %
-------------------------------------------------------------
100 200000 2741.3 2764.7 2231.9 -18
100 20000 279.3 270.3 219.0 -27
100 20000 278.0 273.1 219.2 -26
100 20000 279.0 271.7 218.8 -27
10 20000 34.0 35.6 28.8 -18
10 20000 30.3 35.2 28.4 -6
10 20000 32.9 34.6 28.4 -15
1 20000 6.4 6.7 6.5 +1
1 20000 6.3 6.8 6.5 +3
1 20000 6.4 6.9 6.4 0

SLUB+Q also wins against SLAB in netperf:

Script:

#!/bin/bash

TIME=60 # seconds
HOSTNAME=localhost # netserver

NR_CPUS=$(grep ^processor /proc/cpuinfo | wc -l)
echo NR_CPUS=$NR_CPUS

run_netperf() {
for i in $(seq 1 $1); do
netperf -H $HOSTNAME -t TCP_RR -l $TIME &
done
}

ITERATIONS=0
while [ $ITERATIONS -lt 12 ]; do
RATE=0
ITERATIONS=$[$ITERATIONS + 1]
THREADS=$[$NR_CPUS * $ITERATIONS]
RESULTS=$(run_netperf $THREADS | grep -v '[a-zA-Z]' | awk '{ print $6 }')

for j in $RESULTS; do
RATE=$[$RATE + ${j/.*}]
done
echo threads=$THREADS rate=$RATE
done

Dell Dual Quad Penryn on Linux 2.6.35-rc4

Loop counts: Larger is better.

Threads SLAB SLUB+Q %
8 690869 714788 + 3.4
16 680295 711771 + 4.6
24 672677 703014 + 4.5
32 676780 703914 + 4.0
40 668458 699806 + 4.6
48 667017 698908 + 4.7
56 671227 696034 + 3.6
64 667956 696913 + 4.3
72 668332 694931 + 3.9
80 667073 695658 + 4.2
88 682866 697077 + 2.0
96 668089 694719 + 3.9

SLUB+Q is a merging of SLUB with some queuing concepts from SLAB and a new way of managing objects in the slabs using bitmaps. It uses a percpu queue so that free operations can be properly buffered and a bitmap for managing the free/allocated state in the slabs. It is slightly more inefficient than SLUB (due to the need to place large bitmaps --sized a few words--in some slab pages if there are more than BITS_PER_LONG objects in a slab) but in general does not increase space use too much.

The SLAB scheme of not touching the object during management is adopted. SLUB+Q can efficiently free and allocate cache cold objects without causing cache misses.

The queueing patches are likely still be a bit rough around corner cases and special features and need to see some more widespread testing.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>