Messages in this thread | | | Subject | [PATCH 0/3] Make count list_lru_one::nr_items lockless | From | Kirill Tkhai <> | Date | Tue, 22 Aug 2017 15:29:08 +0300 |
| |
This series aims to improve scalability of list_lru shrinking and to make list_lru_count_one() working more effective.
On RHEL7 3.10 kernel I observe high system time usage and time spent in super_cache_count() during slab shrinking:
0,94% mysqld [kernel.vmlinux] [k] _raw_spin_lock [k] _raw_spin_lock 0,57% mysqld [kernel.vmlinux] [k] shrink_slab [k] shrink_slab 0,51% mysqld [kernel.vmlinux] [k] super_cache_count [k] super_cache_count 0,32% mysqld [kernel.vmlinux] [k] __list_lru_count_one.isra.2 [k] _raw_spin_lock 0,32% mysqld [kernel.vmlinux] [k] list_lru_count_one [k] __list_lru_count_one.isra.2
(percentage of all node time; collected via $perf record --call-graph fp -j k -a). It's an example, how the processes traces look like. And many processes spend time in the above.
There is a node with many containers (more, than 200), and (as it's usually happen) containers have no free memory (cache is actively used). Since shrink_slab() iterates all superblocks, and it happens frequently, the shrink scales badly, and node spends in sys more than 90% of time.
The patchset makes list_lru_count_one() lockless via RCU technics. Patch [1/3] adds a new rcu field to struct list_lru_memcg and makes functions account its size during allocations. Patch [2/3] makes list_lru_node::memcg_lrus RCU-protected and RCU-accessible. Patch [3/3] removes the lock and adds rcu read protection into __list_lru_count_one().
---
Kirill Tkhai (3): mm: Add rcu field to struct list_lru_memcg mm: Make list_lru_node::memcg_lrus RCU protected mm: Count list_lru_one::nr_items lockless
include/linux/list_lru.h | 3 +- mm/list_lru.c | 77 ++++++++++++++++++++++++++++++---------------- 2 files changed, 53 insertions(+), 27 deletions(-)
-- Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
| |