Linux μ»€λ„μ—μ„œ νŽ˜μ΄μ§€ ꡐ체λ₯Ό λ‹€μŒ 두 가지 방법 쀑 ν•˜λ‚˜λ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

  1. kswapd λ₯Ό ν†΅ν•œ Asynchronously,
  2. direct reclaim λ₯Ό ν†΅ν•œ Synchronously

νŽ˜μ΄μ§€ ν• λ‹Ή μ‹œκ°„μ— ν• λ‹Ή μž‘μ—…μ€ zone ꡬ쑰체 μΈμŠ€ν„΄μŠ€μ˜ freelist 멀버에 λ“±λ‘ν–ˆλ˜ νŽ˜μ΄μ§€λ₯Ό μ¦‰μ‹œ λ°›κ²Œλ˜λ―€λ‘œ μˆ˜ν–‰ μ€‘μ΄λ˜ μž‘μ—…μ„ λ°”λ‘œ λ‹€μ‹œ μž‘μ—… ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ§κ°„μ ‘μ μœΌλ‘œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(λ©”λͺ¨λ¦¬ ν• λ‹Ήν•œ ν”„λ‘œκ·Έλž¨)을 μ‹€ν–‰ν•œλ‹€κ³  λ΄…λ‹ˆλ‹€. (λ©”λͺ¨λ¦¬ ν• λ‹Ή μ˜€λ²„ν—€λ“œκ°€ 거의 μ—†μŒ)

  1. kswapd λ₯Ό ν†΅ν•œ Asynchronously

νŽ˜μ΄μ§€ 할당을 μž‘μ—…μ„ ν™•μ‹€νžˆ 끝 마치기 직전에, μ‚¬μš© κ°€λŠ₯ν•œ νŽ˜μ΄μ§€κ°€ zone low watermark 에 λ„λ‹¬ν•œμ§€ ν™•μΈν•˜κ³  λ§Œμ•½ κ·Έλ ‡λ‹€λ©΄ kswapd κ°€ κΉ¨μ–΄λ‚©λ‹ˆλ‹€. Kswapd (Kswapd wake up API 내뢀에 kcompactd λ₯Ό κΉ¨μš°λŠ” 루틴이 있음)λŠ” μƒˆ νŽ˜μ΄μ§€ 할당을 μœ„ν•œ 곡간을 λ§Œλ“€κΈ° μœ„ν•΄ 제거 ν•  λΉ„ν™œμ„± νŽ˜μ΄μ§€λ₯Ό μ°ΎλŠ” μž‘μ—…μΈ νŽ˜μ΄μ§€ μŠ€μΊ”μ„ μ‹œμž‘ν•©λ‹ˆλ‹€. kswapd μž‘μ—…μ„ 톡해 κΈ°μ‘΄ μž‘μ—…μ€ 지연 μ‹œκ°„μ΄ 없이 각자의 zone 의 멀버인 freelist λͺ©λ‘μ—μ„œ λ©”λͺ¨λ¦¬λ₯Ό 계속 ν• λ‹Ή ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  1. direct reclaim λ₯Ό ν†΅ν•œ Synchronously

μ‚¬μš© κ°€λŠ₯ν•œ νŽ˜μ΄μ§€μ— λŒ€ν•œ μˆ˜μš”κ°€ kswapd μž‘μ—…μ΄ 곡급 ν•  수 μžˆλŠ” μˆ˜μ€€μ„ μ΄ˆκ³Όν•˜λ©΄ νŽ˜μ΄μ§€ 할당이 λ‹€λ₯΄κ²Œ μž‘λ™ν•©λ‹ˆλ‹€. ν• λ‹Ή μž‘μ—…μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ νŽ˜μ΄μ§€ μˆ˜κ°€ ν•΄λ‹Ή zone 의 min watermark μ΄ν•˜μΈ 것을 ν™•μΈν•˜λ©΄ μž‘μ—…μ€ 더 이상 zone 의 freelist 멀버 λͺ©λ‘μ—μ„œ νŽ˜μ΄μ§€λ₯Ό κ°€μ Έ μ˜€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έ λŒ€μ‹ μ—, μž‘μ—…μ€ kswapd 와 λ™μΌν•œ CPU-bound 루틴(각 CPU 와 ν•΄λ‹Ήν•˜λŠ” zone 에 ν•œμ •μ μΈ 루틴듀)을 μ‹€ν–‰ν•˜μ—¬ νŽ˜μ΄μ§€λ₯Ό μŠ€μΊ”ν•˜κ³  μ œκ±°ν•˜μ—¬ 자체 할당을 μΆ©μ‘±ν•©λ‹ˆλ‹€. 이것을 direct reclaim (직접 회수)라고 ν•©λ‹ˆλ‹€.

직접 회수λ₯Ό μˆ˜ν–‰ν•˜λŠ” 데 μ†Œμš”λ˜λŠ” μ‹œκ°„μ€ 상당 ν•  수 있으며, μ’…μ’… μž‘μ€ order0 ν• λ‹Ήμ˜ 경우 μˆ˜μ‹­ ~ 수백 밀리 μ΄ˆκ°€ 걸리고 order9 κ±°λŒ€ν•œ νŽ˜μ΄μ§€ ν• λ‹Ήμ˜ 경우 0.5 초 이상이 κ±Έλ¦½λ‹ˆλ‹€.

사싀, λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œμ—μ„œλŠ” kswapd κ°€ μ‹€μ œλ‘œ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

직접 회수λ₯Ό λ°©μ§€ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œλ§Œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

λ©”λͺ¨λ¦¬ λΆ€μ‘± ν˜„μƒμ΄ 직접 회수λ₯Ό νŠΈλ¦¬κ±°ν•˜κΈ°μ— μΆ©λΆ„ν•˜λ©΄ μ‹œμŠ€ν…œμ—μ„œ μ‹€ν–‰ 쀑인 λͺ¨λ“  μž‘μ—…μ—μ„œ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜λ‚˜μ˜ 곡격적인 λ©”λͺ¨λ¦¬ ν• λ‹Ή μž‘μ—…μ€ μΆ”κ°€ λ©”λͺ¨λ¦¬λ₯Ό 거의 ν• λ‹Ήν•˜μ§€ μ•ŠλŠ” μ†Œκ·œλͺ¨ μž‘μ—…μ— 이차적인 데미지λ₯Ό 쀄 수 μžˆμŠ΅λ‹ˆλ‹€. nscd(name service cache daemon, DNS name 검색 μ‹œμ— μΊμ‹œ 역할을 함. DNS λ₯Ό μ§€μ†μ μœΌλ‘œ μ‚¬μš©ν•œλ‹€λ©΄ μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œ, 체감 μƒμœΌλ‘œλ„ ꡉμž₯ν•œ 속도 차이λ₯Ό λŠλ‚„ 수 있음) DNS Qeury λ₯Ό μΊμ‹±ν•˜κΈ° μœ„ν•΄ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  λ•Œ μΆ”κ°€ 지연 μ‹œκ°„μ„ 100msλ‚˜ μ£Όμž…ν•˜λŠ” 상황을 고렀해보면 μ–΄λ–¨κΉŒμš”.

μž¬μ‹œλ„ 폭풍(retry storms) -> 과도응닡(overshoot)

mm: Support multiple kswapd threads per node - Buddy Lumpkin μ—μ„œ λ°œμ·Œν•¨
@ 2018-04-02 9:24

λͺ©μ°¨