рдХреИрд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рд╣рдордиреЗ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ SLAB рдХреИрд╢ рдХреА рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛

рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рдмрдврд╝рддреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдиреЗ рдПрдХ рдЧрдВрднреАрд░ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдЬрд┐рд╕рд╕реЗ рдмрдбрд╝реА рдорд╢реАрдиреЛрдВ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ SLAB рдХреИрд╢ рдХрд╛ рдмрд╛рдИрдкрд╛рд╕ рд╕рдордп рдХрдВрдЯреЗрдирд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЫреЛрдЯреА рдЕрд╡рдзрд┐ рдореЗрдВ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рдХреА рд╕рдХреНрд░рд┐рдп рдЦрдкрдд рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╡реНрдпрд╕реНрдд рд▓реВрдк рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ, рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХрд╛ 100% рдЦрдкрдд рдХрд░рддрд╛ рд╣реИред рдЖрдЬ рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рд╣рдордиреЗ SLB рдХреИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП memcg рдирд┐рдпрдВрддреНрд░рдг рд╕рдореВрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рд╕рдВрдХреЛрдЪрди_рд╕реНрд▓реИрдм () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдмрджрд▓рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред

рд╕реНрдореГрддрд┐ рдХреА рд╕рдлрд╛рдИ

рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рд╡рд╛рд▓ рдХреНрдпреЛрдВ рдЙрдард╛? рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐ рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрдВрдЯреЗрдирд░ рдФрд░ рдореЗрдореЛрд░реА рдХрдВрдЯреНрд░реЛрд▓ рдЧреНрд░реБрдк (рдореЗрдордЧ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕рдордп-рд╕рдордп рдкрд░ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЦрдкрдд рдХреА рдЕрдЬреАрдм рдЪреЛрдЯрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рд╕реНрдЯрдо рд▓реЛрдб рд▓рдЧрднрдЧ 50% рдерд╛, рдФрд░ рдЪрд░рдо рд╕рдордп рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХрд╛ 100% рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд▓рдЧрднрдЧ рд╕рднреА рдЗрд╕реЗ рдХрд░реНрдиреЗрд▓ (рдПрд╕рдЖрдИрдПрд╕ рд╕рдордп) рджреНрд╡рд╛рд░рд╛ рднрд╕реНрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдиреЛрдб рд╕реНрд╡рдпрдВ рдмрд╣реБ-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдерд╛, рдФрд░ рдЙрд╕ рдкрд░ рд▓рдЧрднрдЧ 200 OpenVZ рдХрдВрдЯреЗрдирд░ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдереЗред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рдиреЗрд╕реНрдЯреЗрдб рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдФрд░ рдореЗрдореЛрд░реА рдХрдВрдЯреНрд░реЛрд▓ рд╕рдореВрд╣реЛрдВ рдХреЗ рдмрд╣реБ-рд╕реНрддрд░реАрдп рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдПред рдкреНрд░рддреНрдпреЗрдХ рдХрд╕реНрдЯрдо рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд▓рдЧрднрдЧ 20 рдорд╛рдЙрдВрдЯ рдкреЙрдЗрдВрдЯ рдФрд░ 20 рдХрдВрдЯреНрд░реЛрд▓ рдореЗрдореЛрд░реА рдЧреНрд░реБрдк (рдореЗрдордЧ) рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдХреНрдд рдбреЙрдХрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдЖрд░реЛрд╣ рдмрд┐рдВрджреБ рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рд╕рдореВрд╣ рдереЗред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рддреЛ рдиреЛрдб рднрд╛рд░реА рдерд╛, рдФрд░ рдЙрд╕ рдкрд░ рд▓реЛрдб рд╣рдорд╛рд░реЗ рд╕рднреА рдЕрдиреНрдп рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд╕рдд рд╕реЗ рдмрд╣реБрдд рдордЬрдмреВрдд рдерд╛ред рд╣рдо рдЗрди рдЪреЛрдЯрд┐рдпреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдХрд╛рд░рдг рдЦреЛрдЬрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рдХрдо рд╡реНрдпрд╕реНрдд рдорд╢реАрдиреЛрдВ рдкрд░ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рдереА, рдЬрд╣рд╛рдВ рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, + 5% sys рд╕рдордп рдкрд░ рдЪреЛрдЯрд┐рдпрд╛рдВ рджреЗрдВ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХрдо рдХрд░рддреА рд╣реИрдВ)ред

Perf рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░рдХреЗ, рдореИрдВ рдЪреЛрдЯреА рдХреЛ рдкрдХрдбрд╝рдиреЗ рдФрд░ рдирд┐рд╢рд╛рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп SLAB рдХреИрд╢ рдХреЛ рд╕рдорд╛рд╢реЛрдзрди рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рд╕реБрдкрд░ рдмреНрд▓реЙрдХ рдХреИрд╢:

- 100,00% 0,00% kswapd0 [kernel.vmlinux] [k] kthread - 99,31% balance_pgdat - 82,11% shrink_zone - 61,69% shrink_slab - 58,29% super_cache_count + 54,56% list_lru_count_one 


рдпрд╣рд╛рдВ рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдирд┐рд╡рд╛рд╕ рдХрд░рддрд╛ рд╣реИред рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХрд░реНрдиреЗрд▓ рдХреИрд╢ рдХреЛ рдЕрдкреНрд░рдпреБрдХреНрдд рдбреЗрдЯрд╛ рдХреЛ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗред рдХрд░реНрдиреЗрд▓ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреГрд╖реНрда рдХреИрд╢ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рдкреГрд╖реНрда рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдкрдврд╝рддреЗ рд╕рдордп рдЙрдирдХреЗ рд▓рд┐рдП рдмрд╛рд░-рдмрд╛рд░ рдкрд╣реБрдВрдЪ рдХреЛ рдЧрддрд┐ рджреЗрддреЗ рд╣реИрдВ (рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдбрд┐рд╕реНрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рджреЛ LRU рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреИрд╢ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рд╣реБрдИ: s_dentry_lru рдФрд░ s_inode_lruред

LRU (рдХрдо рд╕реЗ рдХрдо рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд)

рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ lru_list рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдХреНрд░рд┐рдп рдореЗрдо рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рдПрдХ рддрддреНрд╡ (list_lru_one) рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдЬрдм рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд SLAB рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрд░реНрдиреЗрд▓ рдЗрд╕реЗ рд╕рд░рдгреА рдХреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд┐рд╕ рдореЗрдореЗрдХрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдпрд╛ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ)ред рд╕рд░рдгреА рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (lru_list :: рдиреЛрдб :: memcg_lrus):

 struct list_lru_memcg { struct rcu_head rcu; /* array of per cgroup lists, indexed by memcg_cache_id */ struct list_lru_one *lru[0]; /*    */ }; struct list_lru_one { struct list_head list; /*    */ /* may become negative during memcg reparenting */ long nr_items; /*     */ }; 

lru [0] ID 0 рдХреЗ рд╕рд╛рде рдореЗрдореЗрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ;
lru [1] ID 1 рдХреЗ рд╕рд╛рде memcg рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ;
...
lru [n] ID n рдХреЗ рд╕рд╛рде рдореЗрдореЗрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ;

LRU рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ s_dentry_lru рдФрд░ s_inode_lru рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдкреНрд░рдпреБрдХреНрдд рдбреЗрдВрдЯреНрд░реА рдФрд░ рдЗрдиреЛрдб рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВред
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реИ рдпрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдореЙрдЧ рд╣реИ, рддреЛ рд╕реВрдЪреА рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрдВрддреНрд░ рдЬрд┐рд╕реЗ рд╕рдВрдХреЛрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рд╡рд╣ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред

Shrinker

рдЬрдм рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕реНрдореГрддрд┐ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди NUMA рдиреЛрдб рдпрд╛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЛрдИ рдореБрдХреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕рдХреА рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╡рд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбрд┐рд╕реНрдХ рдХреЛ рдлреЗрдВрдХрдиреЗ рдпрд╛ рдбрдВрдк рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ: рдкреЗрдЬ рдХреИрд╢ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ 1) рдкреГрд╖реНрда; 2) рдПрдХ рд╕реНрд╡реИрдк рдореЗрдВ рдЕрдирд╛рдо рдореЗрдореЛрд░реА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреЗрдЬ рдФрд░ 3) рдХреИрд╢реНрдб SLAB рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордирд╛ рдХреА рдЧрдИ рд╕рдорд╕реНрдпрд╛ рдЙрдирд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ)ред

рдХреИрд╢реНрдб SLAB рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рд╕реЗ рд╕реАрдзреЗ рдкреГрд╖реНрдареЛрдВ рдХреА рд░рд┐рд▓реАрдЬрд╝ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ: рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдирдХрд╛ рдЖрдХрд╛рд░ рдкреГрд╖реНрда рдЖрдХрд╛рд░ рд╕реЗ рдХрд╛рдлреА рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдкреГрд╖реНрда рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ SLAB рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рдореБрдлреНрдд рдореЗрдореЛрд░реА рдЧреИрдк рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп SLAB рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рд╕рд░рд▓ рдФрд░ рдХрд╛рдлреА рдХреБрд╢рд▓ рд╣реИред рдПрдХ рдЗрдЪреНрдЫреБрдХ рдкрд╛рдардХ do_shrink_slab () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдПрдХ рднрд╛рдЧ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрддреНрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИред

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдлрд╛рдИ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рд╡рд░рдг рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдХрдВрдкреНрд░реЗрдХреНрдЯрд░ рдХрдВрдкреНрд░реЗрд╢рд░ рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 static unsigned long do_shrink_slab(struct shrink_control *shrinkctl, struct shrinker *shrinker, int priority) { тАж /*   */ freeable = shrinker->count_objects(shrinker, shrinkctl); if (freeable == 0) return 0; total_scan = _(freeable); while (total_scan >= batch_size) { /*   */ ret = shrinker->scan_objects(shrinker, shrinkctl); total_scan -= shrinkctl->nr_scanned; } ... } 

рд╕рдВрдХреЛрдЪрди рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ s_dentry_lru рдФрд░ s_inode_lru рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдкреНрд░рдпреБрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рд░рдЦрддрд╛ рд╣реИ:

 struct super_block { ... struct shrinker s_shrink; /* per-sb shrinker handle */ ... struct list_lru s_dentry_lru; struct list_lru s_inode_lru; тАж }; 


.Count_objects рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддреА рд╣реИ:

 static unsigned long super_cache_count(struct shrinker *shrink, struct shrink_control *sc) { total_objects += list_lru_shrink_count(&sb->s_dentry_lru, sc); total_objects += list_lru_shrink_count(&sb->s_inode_lru, sc); /*     ) */ total_objects = vfs_pressure_ratio(total_objects); return total_objects; } 


.Scan_objects рд╡рд┐рдзрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддреА рд╣реИ:

 static unsigned long super_cache_scan(struct shrinker *shrink, struct shrink_control *sc) { /*     s_dentry_lru */ prune_dcache_sb(sb, sc); /*     s_inode_lru */ prune_icache_sb(sb, sc); } 

рдореБрдХреНрдд рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ sc рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрдордХрдЧ рдХреЛ рд╡рд╣рд╛рдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЛ LRU рд╕реЗ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

 struct shrink_control { int nid; /* ID NUMA  */ unsigned long nr_to_scan; /*   */ struct mem_cgroup *memcg; /* memcg */ }; 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, prune_dcache_sb () рд╕рд░рдгреА рд╕рдВрд░рдЪрдирд╛ рд╕реВрдЪреА_lru_memcg :: lru [] рд╕реЗ рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред Prune_icache_sb () рд╡рд╣реА рдХрд░рддрд╛ рд╣реИред

рдкреБрд░рд╛рдирд╛ рд╕рдВрдХреЛрдЪреА рдмрд╛рдИрдкрд╛рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо

рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, SLAB рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ "рдмреЗрджрдЦрд▓ рдХрд░рдирд╛" рдЬрд┐рд╕рдореЗрдВ рдореЗрдореЛрд░реА рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ
sc-> target_mem_cgroup рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛрддрд╛ рд╣реИ:

 shrink_node() { тАж struct mem_cgroup *root = sc->target_mem_cgroup; /*      sc->target_mem_cgroup  */ memcg = mem_cgroup_iter(root, NULL, &reclaim); do { тАж shrink_slab(memcg, ...); тАж } while ((memcg = mem_cgroup_iter(root, memcg, &reclaim))); ... } 

рд╣рдо рд╕рднреА рдЪрд╛рдЗрд▓реНрдб рдореЗрдореЗрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЛрдЪрди_рд╕реНрд▓рд╛рдм () рдХрд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╕рдВрдХреЛрдЪрди_рд╕реНрд▓реИрдм () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рд╕рднреА рдХрдореНрдкреНрд░реЗрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП do_shrink_slab () рдХрд╣рддреЗ рд╣реИрдВ:

 static unsigned long shrink_slab(gfp_t gfp_mask, int nid, struct mem_cgroup *memcg, int priority) { list_for_each_entry(shrinker, &shrinker_list, list) { struct shrink_control sc = { .nid = nid, .memcg = memcg, }; ret = do_shrink_slab(&sc, shrinker, ...); } } 

рд╕реНрдорд░рдг рдХрд░реЛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдВрдХреЛрдЪрдирдХрд░реНрддрд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рдЧрд┐рдирддреА рдХрд░реЗрдВ рдХрд┐ 20 рдореЗрдореЗрдХ рдФрд░ 200 рдорд╛рдЙрдВрдЯ рдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ 200 рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреЗрд╕ рдХреЗ рд▓рд┐рдП do_shrink_slab () рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреБрд▓ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 200 * 20 рдорд╛рдЙрдВрдЯ рдкреЙрдЗрдВрдЯ рдФрд░ 200 * 20 рдХрдВрдЯреНрд░реЛрд▓ рдЧреНрд░реБрдк рд╣реИрдВред рдпрджрд┐ рд╕рдмрд╕реЗ рдКрдкрд░реА рдореЗрдо рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдЙрд╕рдХреЗ рд╕рднреА рдЪрд╛рдЗрд▓реНрдб рдореЗрдореЗрдХ (рдпрд╛рдиреА, рдЖрдорддреМрд░ рдкрд░ рд╕рдм рдХреБрдЫ) рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рд░ рдПрдХ рдХреЛ рд╕рдВрдХреЛрдЪреА_рд▓рд┐рд╕реНрдЯ рд╕реЗ рд╣рдЯрдХрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХрд░реНрдиреЗрд▓ do_shrink_slab () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ 200 * 20 * 200 * 20 = 16000000 рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред

рдЗрд╕реА рд╕рдордп, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рдХреА рднрд╛рд░реА рд╕рдВрдЦреНрдпрд╛ рдмреЗрдХрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧреА: рдХрдВрдЯреЗрдирд░ рдЖрдорддреМрд░ рдкрд░ рдЖрдкрд╕ рдореЗрдВ рдЕрд▓рдЧ-рдерд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ CT1 CT2 рдореЗрдВ рдмрдирд╛рдП рдЧрдП рд╕реБрдкрд░_рдмреНрд▓реЙрдХ 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЖрдорддреМрд░ рдкрд░ рдХрдо рд╣реЛрддреА рд╣реИред рдпрд╛, рдХреНрдпрд╛ рд╕рдорд╛рди рд╣реИ, рдЕрдЧрд░ memcg1 CT1 рд╕реЗ рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рд╕рдореВрд╣ рд╣реИ, рддреЛ рд╕реБрдкрд░_рдмреНрд▓реЙрдХ 2-> s_dentry_lru-> рдиреЛрдб-> memcg_lrus-> lru [memcg1_id] рд╕рд░рдгреА рдХрд╛ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реЛрдЧреА, рдФрд░ do_shrink_sababl_sabab_sabink_sabab рдкрд░ рдХреЛрдИ рдирд┐рдпрдВрддреНрд░рдг рд╕реВрдЪреА рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рд╕рд░рд▓ рдмреИрд╢ рд▓рд┐рдкрд┐ (рдкреИрдЪрд╕реЗрдЯ рд╕реЗ рдбреЗрдЯрд╛, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓рд┐рдВрдЧ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:
 $echo 1 > /sys/fs/cgroup/memory/memory.use_hierarchy $mkdir /sys/fs/cgroup/memory/ct $echo 4000M > /sys/fs/cgroup/memory/ct/memory.kmem.limit_in_bytes $for i in `seq 0 4000`; do mkdir /sys/fs/cgroup/memory/ct/$i; echo $$ > /sys/fs/cgroup/memory/ct/$i/cgroup.procs; mkdir -ps/$i; mount -t tmpfs $is/$i; touch s/$i/file; done 

рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рдЖрдк рд▓рдЧрд╛рддрд╛рд░ 5 рдмрд╛рд░ рдХреИрд╢ рд░реАрд╕реЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
 $time echo 3 > /proc/sys/vm/drop_caches 

рдкрд╣рд▓рд╛ рдкреБрдирд░рд╛рд╡реГрддрд┐ 14 рд╕реЗрдХрдВрдб рддрдХ рд░рд╣рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреИрд╢реНрдб рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╣реИрдВ: 0.00 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ 13.78 рд╕рд┐рд╕реНрдЯрдо 0: 13.78 99% рд╕реАрдкреАрдпреВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ ред
рджреВрд╕рд░реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ 5 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдзрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рд╣реИрдВ: 0.00user 5.59system 0: 05.60elapsed 99% CPUред
рддреАрд╕рд░реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ 5 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ: 0.00user 5.48system 0: 05.48elapsed 99% CPU
рдЪреМрдерд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ 8 рд╕реЗрдХрдВрдб рд▓реЗрддрд╛ рд╣реИ: 0.00user 8.35system 0: 08.35elapsed 99% CPU
рдкрд╛рдВрдЪрд╡реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ 8 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ: 0.00user 8.34system 0: 08.35elapsed 99% CPU

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рд╡реЗрдирд┐рд▓рд╛ рдХреЛрд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдХреЛрдЪрди рдмрд╛рдИрдкрд╛рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдирдИ рд╕рдВрдХреЛрдЪрди рдмрд╛рдИрдкрд╛рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

рдирдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛:

  1. рдЙрд╕реЗ рдкреБрд░рд╛рдиреЗ рдХреЗ рджреЛрд╖реЛрдВ рд╕реЗ рдореБрдХреНрдд рдХрд░реЛ рдФрд░
  2. рдирдП рддрд╛рд▓реЗ рди рдЬреЛрдбрд╝реЗрдВред Do_shrink_slab () рдХреЛ рдХреЗрд╡рд▓ рддрдм рд╣реА рдХреЙрд▓ рдХрд░реЗрдВ рдЬрдм рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, s_dentry_lru рд╕рд░рдгреА рд╕реЗ рдпрд╛ s_inode_lru рд╕рд░рдгреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ рд╕реВрдЪреА рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рд╕реАрдзреЗ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рд╖рдо рд╕рд┐рдХреБрдбрд╝рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдирдИ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рди рдХреЗрд╡рд▓ рд╕реБрдкрд░рдмреНрд▓реЙрдХ рдХреЗ рд╕рд┐рдХреНрдпреЛрд░рд░реНрд╕ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рдирд╣реАрдВ рд╣реИрдВред рдкрд╛рдардХ рдХреАрд╡рд░реНрдб рдкреНрд░реАрд▓реЛрдХ_рд╢реНрд░реАрдВрдХрд░ () рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдореЗрдВ)ред рдирдИ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреА рдХреЛрдбрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП: "рдпрд╣ do_shrink_slab () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░" do_shrink_slab () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред

рдЖрдИрдбреАрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рднреАрддрд░ рддрд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдмрд┐рдЯ рдлрд╝реАрд▓реНрдб рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИ: рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмрд┐рдЯреНрд╕ рдХреЗ рдкрд░рдорд╛рдгреБ рд╕рдВрд╢реЛрдзрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдореЗрдореЛрд░реА рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЖрдкрдХреЛ рддрд╛рд▓реЗ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдХреБрд╢рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкреНрд░реЗрд╢рд░ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдИрдбреА (рд╕рдВрдХреЛрдЪрдХ :: рдЖрдИрдбреА) рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдХрдЧ рдореЗрдВ рдПрдХ рдмрд┐рдЯрдореИрдк рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд▓реЛрдЧреЛрдВ рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЖрдИрдбреА рд╕реЗ рдпреБрдХреНрдд рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдкрд╣рд▓рд╛ рддрддреНрд╡ s_dentry_lru-> рдиреЛрдб-> memcg_lrus-> lru [memcg_id] рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдореЗрдореНрдХ рдмрд┐рдЯрдореИрдк рдирдВрдмрд░ рд╕рдВрдХреЛрдЪрдирдХрд░реНрддрд╛> рдЖрдИрдбреА рдХреЗ рд╕рд╛рде 1 рдмрд┐рдЯ рдкрд░ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред S_inode_id рдХреЗ рд╕рд╛рде рднреА рдпрд╣реА рдмрд╛рдд рд╣реИред

рдЕрдм рд╕рдВрдХреЛрдЪрди_slab () рдореЗрдВ рд▓реВрдк рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдХрдВрдкреНрд░реЗрд╢рд░реНрд╕ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 unsigned long shrink_slab() { тАж for_each_set_bit(i, map, shrinker_nr_max) { тАж shrinker = idr_find(&shrinker_idr, i); тАж do_shrink_slab(&sc, shrinker, priority); тАж } } 

(рдмрд┐рдЯ рд╕рдлрд╛рдИ рддрдм рднреА рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм рд╕рдВрдХреЛрдЪрдирдХрд░реНрддрд╛ рд░рд╛рдЬреНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ тАЭрдпрд╣ do_shrink_sab () рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЧреАрдердм рдХреЛ рдкреНрд░рддрд┐рдмрджреНрдз рджреЗрдЦреЗрдВред

рдпрджрд┐ рдЖрдк рдХреИрд╢ рд░реАрд╕реЗрдЯ рдкрд░реАрдХреНрд╖рдг рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ, рддреЛ рдирдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдХрд╛рдлреА рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рддрд╛ рд╣реИ:
 $time echo 3 > /proc/sys/vm/drop_caches 

рдкрд╣рд▓рд╛ рдЪрд▓рдирд╛: 0.00user 1.10system 0: 01.10elapsed 99% CPU
рджреВрд╕рд░рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐: 0.00user 0.00system 0: 00.01elapsed 64% CPU
рддреАрд╕рд░рд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐: 0.00user 0.01system 0: 00.01elapsed 82% CPU
рдЪреМрдерд╛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐: 0.00user 0.00system 0: 00.01elapsed 64% CPU
рдкрд╛рдВрдЪрд╡реАрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐: 0.00user 0.01system 0: 00.01elapsed 82% CPU
рдкрд╛рдВрдЪрд╡реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреВрд╕рд░реЗ рдХреА рдЕрд╡рдзрд┐ 0.01 рд╕реЗрдХрдВрдб, рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 548 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред

рдЪреВрдВрдХрд┐ рдорд╢реАрди рдкрд░ рдореЗрдореЛрд░реА рдХреА рдХрдореА рдХреЗ рд╕рд╛рде рдХреИрд╢ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХреА рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдВрдЯреЗрдирд░реЛрдВ рдФрд░ рдореЗрдореЛрд░реА рдХрдВрдЯреНрд░реЛрд▓ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдорд╢реАрдиреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдкреИрдЪ рдХрд╛ рдПрдХ рд╕реЗрдЯ (17 рдЯреБрдХрдбрд╝реЗ) рдХреЛ рд╡реЗрдирд┐рд▓рд╛ рдХреЛрд░ рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕реЗ 4.19 рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреИрдЪ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдПрдХ Google рдХрд░реНрдордЪрд╛рд░реА рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред рдЗрд╕рд▓рд┐рдП, рдкреИрдЪ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЛрдб рдкрд░ рдЖрдЧреЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдирддреАрдЬрддрди, рдкреИрдЪрд╕реЗрдЯ рдХреЛ 9 рд╡реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛; рдФрд░ рд╡реИрдирд┐рд▓рд╛ рдХреЛрд░ рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рд╡реЗрд╢ рдореЗрдВ рд▓рдЧрднрдЧ 4 рдорд╣реАрдиреЗ рд▓рдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдЬ, рдкреИрдЪрд╕реЗрдЯ рдХреЛ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрдЬрд╝реЛ 7 рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг vz7.71.9 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ

Source: https://habr.com/ru/post/hi435694/


All Articles