eBPF/BCC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์€ Ceph ๋Œ€๊ธฐ ์‹œ๊ฐ„๋ถ€ํ„ฐ ์ปค๋„ ํŒจ์น˜๊นŒ์ง€

eBPF/BCC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์€ Ceph ๋Œ€๊ธฐ ์‹œ๊ฐ„๋ถ€ํ„ฐ ์ปค๋„ ํŒจ์น˜๊นŒ์ง€

Linux์—๋Š” ์ปค๋„๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•œ ์ˆ˜๋งŽ์€ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ ํ”„๋กœ๋•์…˜์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ช‡ ๋…„ ์ „์—๋Š” ๋˜ ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค - eBPF. ์ด๋ฅผ ํ†ตํ•ด ๋‚ฎ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ํƒ€์‚ฌ ๋ชจ๋“ˆ์„ ์ปค๋„์— ๋กœ๋“œํ•  ํ•„์š” ์—†์ด ์ปค๋„ ๋ฐ ์‚ฌ์šฉ์ž ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

eBPF๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋Š” ์ด๋ฏธ ๋งŽ์ด ์žˆ์œผ๋ฉฐ, ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์‹ ๋งŒ์˜ ํ”„๋กœํŒŒ์ผ๋ง ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. PythonBCC. ์ด ๊ธฐ์‚ฌ๋Š” ์‹ค์ œ ์‚ฌ๊ฑด์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ƒํ™ฉ์—์„œ ๊ธฐ์กด ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ธํ”„๋Š” ๋Š๋ฆฌ๋‹ค

Ceph ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒˆ ํ˜ธ์ŠคํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ ํ›„ ์“ฐ๊ธฐ ์š”์ฒญ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋‹ค๋ฅธ ์„œ๋ฒ„๋ณด๋‹ค ํ›จ์”ฌ ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

eBPF/BCC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์€ Ceph ๋Œ€๊ธฐ ์‹œ๊ฐ„๋ถ€ํ„ฐ ์ปค๋„ ํŒจ์น˜๊นŒ์ง€
๋‹ค๋ฅธ ํ”Œ๋žซํผ๊ณผ ๋‹ฌ๋ฆฌ ์ด ํ˜ธ์ŠคํŠธ๋Š” bcache์™€ ์ƒˆ๋กœ์šด Linux 4.15 ์ปค๋„์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์‚ฌ์šฉ๋œ ๊ฒƒ์€ ์ด๋ฒˆ์ด ์ฒ˜์Œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ˆœ๊ฐ„ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์€ ์ด๋ก ์ ์œผ๋กœ ๋ฌด์—‡์ด๋“  ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ ์กฐ์‚ฌ

๋จผ์ € ceph-osd ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋ฐ˜ํ™˜ ํ•œ ะธ ํ™”์—ผ๊ฒฝ (์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—):

eBPF/BCC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์€ Ceph ๋Œ€๊ธฐ ์‹œ๊ฐ„๋ถ€ํ„ฐ ์ปค๋„ ํŒจ์น˜๊นŒ์ง€
๊ทธ๋ฆผ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๊ธฐ๋Šฅ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค fdatasync() ํ•จ์ˆ˜์— ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค. generic_make_request(). ์ด๋Š” ๋ฌธ์ œ์˜ ์›์ธ์ด osd ๋ฐ๋ชฌ ์ž์ฒด ์™ธ๋ถ€์— ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ปค๋„์ผ ์ˆ˜๋„ ์žˆ๊ณ  ๋””์Šคํฌ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. iostat ์ถœ๋ ฅ์—์„œ๋Š” bcache ๋””์Šคํฌ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ ๋†’์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ๋ฅผ ๊ฒ€์‚ฌํ•  ๋•Œ systemd-udevd ๋ฐ๋ชฌ์ด ๋งŽ์€ ์–‘์˜ CPU ์‹œ๊ฐ„(์—ฌ๋Ÿฌ ์ฝ”์–ด์—์„œ ์•ฝ 20%)์„ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ƒํ•œ ๋™์ž‘์ด๋ฏ€๋กœ ์ด์œ ๋ฅผ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Systemd-udevd๋Š” uevent์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. udevadm ๋ชจ๋‹ˆํ„ฐ. ์‹œ์Šคํ…œ์˜ ๊ฐ ๋ธ”๋ก ์žฅ์น˜์— ๋Œ€ํ•ด ๋งŽ์€ ์ˆ˜์˜ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ํŠน์ดํ•œ ํ˜„์ƒ์ด๋ฏ€๋กœ ๋ฌด์—‡์ด ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

BCC ํˆดํ‚ท ์‚ฌ์šฉ

์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์•Œ์•„๋‚ธ ๋ฐ”์™€ ๊ฐ™์ด ์ปค๋„(๋ฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ceph ๋ฐ๋ชฌ)์€ ๋‹ค์Œ ์ž‘์—…์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค. generic_make_request(). ์ด ๊ธฐ๋Šฅ์˜ ์†๋„๋ฅผ ์ธก์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ˆ์— BCC ์ด๋ฏธ ํ›Œ๋ฅญํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค - ๊ธฐ๋Šฅ. ์ถœ๋ ฅ ์‚ฌ์ด์— 1์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ PID๋กœ ๋ฐ๋ชฌ์„ ์ถ”์ ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

eBPF/BCC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์€ Ceph ๋Œ€๊ธฐ ์‹œ๊ฐ„๋ถ€ํ„ฐ ์ปค๋„ ํŒจ์น˜๊นŒ์ง€
์ด ๊ธฐ๋Šฅ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ํ•˜๋Š” ์ผ์€ ์š”์ฒญ์„ ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„ ํ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

์บ์‹œ ์‹ค์ œ๋กœ ์„ธ ๊ฐœ์˜ ๋””์Šคํฌ๋กœ ๊ตฌ์„ฑ๋œ ๋ณต์žกํ•œ ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

  • ๋ฐฑ์—… ์žฅ์น˜(์บ์‹œ๋œ ๋””์Šคํฌ), ์ด ๊ฒฝ์šฐ์—๋Š” ๋Š๋ฆฐ HDD์ž…๋‹ˆ๋‹ค.
  • ์บ์‹ฑ ์žฅ์น˜(์บ์‹ฑ ๋””์Šคํฌ), ์—ฌ๊ธฐ์„œ๋Š” NVMe ์žฅ์น˜์˜ ํ•œ ํŒŒํ‹ฐ์…˜์ž…๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” bcache ๊ฐ€์ƒ ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

์š”์ฒญ ์ „์†ก ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค๋Š” ๊ฒƒ์€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์žฅ์น˜ ์ค‘ ์–ด๋–ค ์žฅ์น˜์— ๋Œ€ํ•œ ๊ฒƒ์ผ๊นŒ์š”? ์ด ๋ฌธ์ œ๋Š” ์ž ์‹œ ํ›„์— ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” uevent๊ฐ€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋Œ€์˜ ์›์ธ์„ ์ •ํ™•ํžˆ ์ฐพ๋Š” ๊ฒƒ์€ ๊ทธ๋ฆฌ ์‰ฌ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ผ์ข…์˜ ์†Œํ”„ํŠธ์›จ์–ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ์—์„œ ์–ด๋–ค ์ข…๋ฅ˜์˜ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์‹คํ–‰๋˜๋Š”์ง€ ์‚ดํŽด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž„์› ๊ฐ™์€ ๊ฒƒ์—์„œ BCC ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ‚คํŠธ. ์ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ถœ๋ ฅ์„ ํŒŒ์ผ๋กœ ๋ณด๋‚ด๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

/usr/share/bcc/tools/execsnoop  | tee ./execdump

์—ฌ๊ธฐ์„œ execsnoop์˜ ์ „์ฒด ์ถœ๋ ฅ์„ ํ‘œ์‹œํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ด€์‹ฌ ์žˆ๋Š” ํ•œ ์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

sh 1764905 5802 0 sudo arcconf getconfig 1 AD | grep Temperature | awk -F '[:/]' '{print $2}' | sed 's/^ ([0-9]*) C.*/1/'

์„ธ ๋ฒˆ์งธ ์—ด์€ ํ”„๋กœ์„ธ์Šค์˜ PPID(์ƒ์œ„ PID)์ž…๋‹ˆ๋‹ค. PID 5802์˜ ํ”„๋กœ์„ธ์Šค๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์˜ ์Šค๋ ˆ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์„ ํ™•์ธํ•  ๋•Œ ์ž˜๋ชป๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. HBA ์–ด๋Œ‘ํ„ฐ์˜ ์˜จ๋„๋Š” 30์ดˆ๋งˆ๋‹ค ์ธก์ •๋˜๋Š”๋ฐ, ์ด๋Š” ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์ฃผ ์ธก์ •๋ฉ๋‹ˆ๋‹ค. ํ™•์ธ ๊ฐ„๊ฒฉ์„ ๋” ๊ธด ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•œ ํ›„ ์ด ํ˜ธ์ŠคํŠธ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋” ์ด์ƒ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์— ๋น„ํ•ด ๋‘๋“œ๋Ÿฌ์ง€์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ bcache ์žฅ์น˜๊ฐ€ ์™œ ๊ทธ๋ ‡๊ฒŒ ๋Š๋ฆฐ์ง€๋Š” ์—ฌ์ „ํžˆ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๊ตฌ์„ฑ์˜ ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ์„ ์ค€๋น„ํ•˜๊ณ  bcache์—์„œ fio๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ฃผ๊ธฐ์ ์œผ๋กœ udevadm ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ uevent๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

BCC ๊ธฐ๋ฐ˜ ๋„๊ตฌ ์ž‘์„ฑ

๊ฐ€์žฅ ๋Š๋ฆฐ ํ˜ธ์ถœ์„ ์ถ”์ ํ•˜๊ณ  ํ‘œ์‹œํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. generic_make_request(). ๋˜ํ•œ ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ๋“œ๋ผ์ด๋ธŒ์˜ ์ด๋ฆ„์—๋„ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ„ํš์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  • ๋“ฑ๋กํ•˜๋‹ค kprobe ์— generic_make_request():
    • ๋””์Šคํฌ ์ด๋ฆ„์„ ํ•จ์ˆ˜ ์ธ์ˆ˜๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋“ฑ๋กํ•˜๋‹ค ํฌ๋ ˆํŠธํ”„๋กœ๋ธŒ ๋ณต๊ท€๋ฅผ ์œ„ํ•ด generic_make_request():
    • ํ˜„์žฌ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
    • ์ €์žฅ๋œ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ฐพ์•„ ํ˜„์žฌ ํƒ€์ž„์Šคํƒฌํ”„์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฒฐ๊ณผ๊ฐ€ ์ง€์ •๋œ ๊ฒƒ๋ณด๋‹ค ํฌ๋ฉด ์ €์žฅ๋œ ๋””์Šคํฌ ์ด๋ฆ„์„ ์ฐพ์•„์„œ ํ„ฐ๋ฏธ๋„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Kprobes ะธ ํฌ๋ ˆํŠธํ”„๋กœ๋ธŒ ์ค‘๋‹จ์  ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฆ‰์‹œ ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ฝ์„ ์ˆ˜์žˆ๋‹ค ๋ฌธ์„œ ะธ ์ข‹์€ ์ด ์ฃผ์ œ์— ๊ด€ํ•œ ๊ธฐ์‚ฌ. ๋‹ค์–‘ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด BCC, ๊ทธ๋Ÿฌ๋ฉด ๋™์ผํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์Šคํฌ๋ฆฝํŠธ ์ธ์ˆ˜ ๊ตฌ๋ฌธ ๋ถ„์„์„ ๊ฑด๋„ˆ๋›ฐ๊ณ  BPF ํ”„๋กœ๊ทธ๋žจ ์ž์ฒด๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

Python ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์˜ eBPF ํ…์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

bpf_text = โ€œโ€โ€ # Here will be the bpf program code โ€œโ€โ€

ํ•จ์ˆ˜ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•ด eBPF ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด์‹œ ํ…Œ์ด๋ธ”. ์šฐ๋ฆฌ๋„ ๋˜‘๊ฐ™์ด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค PID๋ฅผ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ตฌ์กฐ๋ฅผ ๊ฐ’์œผ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

struct data_t {
	u64 pid;
	u64 ts;
	char comm[TASK_COMM_LEN];
	u64 lat;
	char disk[DISK_NAME_LEN];
};

BPF_HASH(p, u64, struct data_t);
BPF_PERF_OUTPUT(events);

์—ฌ๊ธฐ์— ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. p, ํ‚ค ์œ ํ˜• ํฌํ•จ u64 ์œ ํ˜• ๊ฐ’ ๊ตฌ์กฐ์ฒด data_t. ์ด ํ…Œ์ด๋ธ”์€ BPF ํ”„๋กœ๊ทธ๋žจ์˜ ๋งฅ๋ฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BPF_PERF_OUTPUT ๋งคํฌ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ, ์ด๋Š” ๋‹ค์Œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ „์†ก ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ.

ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์‚ฌ์ด ๋˜๋Š” ๋‹ค๋ฅธ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‚ฌ์ด์˜ ์ง€์—ฐ์„ ์ธก์ •ํ•  ๋•Œ ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋™์ผํ•œ ์ปจํ…์ŠคํŠธ์— ์†ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ธฐ๋Šฅ์˜ ๋ณ‘๋ ฌ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‚ฌ์ด์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋Œ€ํ•œ ์ข‹์€ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒ์ฒด์ž ๋ณต์„ฑ ์œ ํ‹ธ๋ฆฌํ‹ฐ, ์—ฌ๊ธฐ์„œ ํ•ด์‹œ ํ…Œ์ด๋ธ” ํ‚ค๋Š” ๋‹ค์Œ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ์š”์ฒญ, ์ด๋Š” ํ•˜๋‚˜์˜ ๋””์Šคํฌ ์š”์ฒญ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ, ์—ฐ๊ตฌ ์ค‘์ธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

void start(struct pt_regs *ctx, struct bio *bio) {
	u64 pid = bpf_get_current_pid_tgid();
	struct data_t data = {};
	u64 ts = bpf_ktime_get_ns();
	data.pid = pid;
	data.ts = ts;
	bpf_probe_read_str(&data.disk, sizeof(data.disk), (void*)bio->bi_disk->disk_name);
	p.update(&pid, &data);
}

์—ฌ๊ธฐ์„œ ํ˜ธ์ถœ๋œ ํ•จ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. generic_make_request(). ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ž‘์—… ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ PID์™€ ๋‚˜๋…ธ์ดˆ ๋‹จ์œ„์˜ ํ˜„์žฌ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ ์„ ํƒํ•œ ํ•ญ๋ชฉ์— ๋ชจ๋“  ๊ฒƒ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด data_t ๋ฐ์ดํ„ฐ. ๊ตฌ์กฐ์—์„œ ๋””์Šคํฌ ์ด๋ฆ„์„ ์–ป์Šต๋‹ˆ๋‹ค. ๋ฐ”์ด์˜ค, ํ˜ธ์ถœํ•  ๋•Œ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. generic_make_request(), ๋™์ผํ•œ ๊ตฌ์กฐ๋กœ ์ €์žฅ ๋ฐ์ดํ„ฐ. ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ•œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ํ•จ์ˆ˜๋Š” ๋ฐ˜ํ™˜ ์‹œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. generic_make_request():

void stop(struct pt_regs *ctx) {
    u64 pid = bpf_get_current_pid_tgid();
    u64 ts = bpf_ktime_get_ns();
    struct data_t* data = p.lookup(&pid);
    if (data != 0 && data->ts > 0) {
        bpf_get_current_comm(&data->comm, sizeof(data->comm));
        data->lat = (ts - data->ts)/1000;
        if (data->lat > MIN_US) {
            FACTOR
            data->pid >>= 32;
            events.perf_submit(ctx, data, sizeof(struct data_t));
        }
        p.delete(&pid);
    }
}

์ด ํ•จ์ˆ˜๋Š” ์ด์ „ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค์˜ PID์™€ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์•Œ์•„๋‚ด์ง€๋งŒ ์ƒˆ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ , ํ‚ค == ํ˜„์žฌ PID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค์˜ ์ด๋ฆ„์„ ์ฐพ์•„์„œ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ GID๋ฅผ ์–ป์œผ๋ ค๋ฉด ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด์ง„ ์‹œํ”„ํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ €๊ฒƒ๋“ค. ์ž‘์—… ์ค‘์ธ ์ปจํ…์ŠคํŠธ์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•œ ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค์˜ PID์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ bpf_get_current_pid_tgid() ์Šค๋ ˆ๋“œ์˜ GID์™€ PID๋ฅผ ๋ชจ๋‘ ๋‹จ์ผ 64๋น„ํŠธ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„๋กœ ์ถœ๋ ฅํ•  ๋•Œ ํ˜„์žฌ ์Šค๋ ˆ๋“œ์—๋Š” ๊ด€์‹ฌ์ด ์—†์ง€๋งŒ ๊ธฐ๋ณธ ํ”„๋กœ์„ธ์Šค์—๋Š” ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์ง€์—ฐ์„ ์ฃผ์–ด์ง„ ์ž„๊ณ„๊ฐ’๊ณผ ๋น„๊ตํ•œ ํ›„ ๊ตฌ์กฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ ์ด๋ฒคํŠธ, ๊ทธ ํ›„์— ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. p.

์ด ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•  Python ์Šคํฌ๋ฆฝํŠธ์—์„œ MIN_US ๋ฐ FACTOR๋ฅผ ์ง€์—ฐ ์ž„๊ณ„๊ฐ’ ๋ฐ ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ์ธ์ˆ˜๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

bpf_text = bpf_text.replace('MIN_US',str(min_usec))
if args.milliseconds:
	bpf_text = bpf_text.replace('FACTOR','data->lat /= 1000;')
	label = "msec"
else:
	bpf_text = bpf_text.replace('FACTOR','')
	label = "usec"

์ด์ œ ๋‹ค์Œ์„ ํ†ตํ•ด BPF ํ”„๋กœ๊ทธ๋žจ์„ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. BPF ๋งคํฌ๋กœ ์ƒ˜ํ”Œ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

b = BPF(text=bpf_text)
b.attach_kprobe(event="generic_make_request",fn_name="start")
b.attach_kretprobe(event="generic_make_request",fn_name="stop")

์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๊ฒฐ์ •ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค ๊ตฌ์กฐ์ฒด data_t ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:

TASK_COMM_LEN = 16	# linux/sched.h
DISK_NAME_LEN = 32	# linux/genhd.h
class Data(ct.Structure):
	_fields_ = [("pid", ct.c_ulonglong),
            	("ts", ct.c_ulonglong),
            	("comm", ct.c_char * TASK_COMM_LEN),
            	("lat", ct.c_ulonglong),
            	("disk",ct.c_char * DISK_NAME_LEN)]

๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” ํ„ฐ๋ฏธ๋„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

def print_event(cpu, data, size):
    global start
    event = ct.cast(data, ct.POINTER(Data)).contents
    if start == 0:
        start = event.ts
    time_s = (float(event.ts - start)) / 1000000000
    print("%-18.9f %-16s %-6d   %-1s %s   %s" % (time_s, event.comm, event.pid, event.lat, label, event.disk))

b["events"].open_perf_buffer(print_event)
# format output
start = 0
while 1:
    try:
        b.perf_buffer_poll()
    except KeyboardInterrupt:
        exit()

์Šคํฌ๋ฆฝํŠธ ์ž์ฒด๋Š” ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GItHub. fio๊ฐ€ ์‹คํ–‰๋˜๊ณ  bcache์— ์“ฐ๊ณ  udevadm ๋ชจ๋‹ˆํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

eBPF/BCC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋†’์€ Ceph ๋Œ€๊ธฐ ์‹œ๊ฐ„๋ถ€ํ„ฐ ์ปค๋„ ํŒจ์น˜๊นŒ์ง€
๋งˆ์ง€๋ง‰์œผ๋กœ! ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ง€์—ฐ๋œ bcache ์žฅ์น˜์ฒ˜๋Ÿผ ๋ณด์˜€์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ง€์—ฐ๋œ ํ˜ธ์ถœ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. generic_make_request() ์บ์‹œ๋œ ๋””์Šคํฌ์˜ ๊ฒฝ์šฐ.

์ปค๋„์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์„ธ์š”

์š”์ฒญ ์ „์†ก ์ค‘์— ์†๋„๊ฐ€ ๋Š๋ ค์ง€๋Š” ๊ฒƒ์€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์š”์ฒญ ํšŒ๊ณ„๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์—๋„ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ†ต๊ณ„ ์ถœ๋ ฅ์— ๋Œ€ํ•œ ํŠน์ • ์š”์ฒญ(/proc/diskstats ๋˜๋Š” iostat)์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋™์•ˆ iostat๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BCC ์Šคํฌ๋ฆฝํŠธ ์ƒ์ฒด ๋Œ€๊ธฐ ์‹œ๊ฐ„, ์š”์ฒญ ํšŒ๊ณ„์˜ ์‹œ์ž‘๊ณผ ๋์„ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์บ์‹œ๋œ ๋””์Šคํฌ์— ๋Œ€ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์„ ์‚ดํŽด๋ณด๋ฉด generic_make_request(), ๊ทธ๋Ÿฌ๋ฉด ์š”์ฒญ์ด ๊ณ„์‚ฐ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ๋” ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ - generic_make_request_checks(), ๋””์Šคํฌ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ์š”์ฒญ์˜ ์ ๋ฒ•์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ - blk_queue_enter(), ํฅ๋ฏธ๋กœ์šด ๋„์ „ ๊ณผ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. wait_event_interruptible():

ret = wait_event_interruptible(q->mq_freeze_wq,
	(atomic_read(&q->mq_freeze_depth) == 0 &&
	(preempt || !blk_queue_preempt_only(q))) ||
	blk_queue_dying(q));

๊ทธ ์•ˆ์—์„œ ์ปค๋„์€ ๋Œ€๊ธฐ์—ด์ด ๊ณ ์ • ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ง€์—ฐ์„ ์ธก์ •ํ•ด๋ณด์ž blk_queue_enter():

~# /usr/share/bcc/tools/funclatency  blk_queue_enter -i 1 -m               	 
Tracing 1 functions for "blk_queue_enter"... Hit Ctrl-C to end.

 	msecs           	: count 	distribution
     	0 -> 1      	: 341  	|****************************************|

 	msecs           	: count 	distribution
     	0 -> 1      	: 316  	|****************************************|

 	msecs           	: count 	distribution
     	0 -> 1      	: 255  	|****************************************|
     	2 -> 3      	: 0    	|                                    	|
     	4 -> 7      	: 0    	|                                    	|
     	8 -> 15     	: 1    	|                                    	|

์šฐ๋ฆฌ๋Š” ํ•ด๊ฒฐ์ฑ…์— ๊ฐ€๊นŒ์›Œ์ง„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์„ ๊ณ ์ •/๊ณ ์ • ํ•ด์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. blk_mq_freeze_queue ะธ blk_mq_unfreeze_queue. ์ด ๋Œ€๊ธฐ์—ด์˜ ์š”์ฒญ์— ์ž ์žฌ์ ์œผ๋กœ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ ๋Œ€๊ธฐ์—ด ์„ค์ •์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ „ํ™”ํ•  ๋•Œ blk_mq_freeze_queue() ํ•จ์ˆ˜ blk_freeze_queue_start() ์นด์šดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค q->mq_freeze_๊นŠ์ด. ๊ทธ ํ›„, ์ปค๋„์€ ๋Œ€๊ธฐ์—ด์ด ๋น„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. blk_mq_freeze_queue_wait().

์ด ๋Œ€๊ธฐ์—ด์„ ์ง€์šฐ๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์ปค๋„์ด ๋Œ€๊ธฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋””์Šคํฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์„ค์ • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” blk_mq_unfreeze_queue(), ์นด์šดํ„ฐ ๊ฐ์†Œ ๋™๊ฒฐ_๊นŠ์ด.

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ƒํ™ฉ์„ ๋ฐ”๋กœ์žก์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. udevadm Trigger ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ธ”๋ก ์žฅ์น˜์— ๋Œ€ํ•œ ์„ค์ •์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค์ •์€ udev ๊ทœ์น™์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. sysfs๋ฅผ ํ†ตํ•ด ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ปค๋„ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ด„์œผ๋กœ์จ ๋Œ€๊ธฐ์—ด์„ ์ •์ง€์‹œํ‚ค๋Š” ์„ค์ •์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. BCC ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”๋“ฌ๋‹ค, ํ„ฐ๋ฏธ๋„์— ๋Œ€ํ•œ ๊ฐ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ปค๋„ ๋ฐ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ์Šคํƒ ์ถ”์ ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. blk_freeze_queue์˜ˆ :

~# /usr/share/bcc/tools/trace blk_freeze_queue -K -U
PID 	TID 	COMM        	FUNC        	 
3809642 3809642 systemd-udevd   blk_freeze_queue
    	blk_freeze_queue+0x1 [kernel]
    	elevator_switch+0x29 [kernel]
    	elv_iosched_store+0x197 [kernel]
    	queue_attr_store+0x5c [kernel]
    	sysfs_kf_write+0x3c [kernel]
    	kernfs_fop_write+0x125 [kernel]
    	__vfs_write+0x1b [kernel]
    	vfs_write+0xb8 [kernel]
    	sys_write+0x55 [kernel]
    	do_syscall_64+0x73 [kernel]
    	entry_SYSCALL_64_after_hwframe+0x3d [kernel]
    	__write_nocancel+0x7 [libc-2.23.so]
    	[unknown]

3809631 3809631 systemd-udevd   blk_freeze_queue
    	blk_freeze_queue+0x1 [kernel]
    	queue_requests_store+0xb6 [kernel]
    	queue_attr_store+0x5c [kernel]
    	sysfs_kf_write+0x3c [kernel]
    	kernfs_fop_write+0x125 [kernel]
    	__vfs_write+0x1b [kernel]
    	vfs_write+0xb8 [kernel]
    	sys_write+0x55 [kernel]
    	do_syscall_64+0x73 [kernel]
    	entry_SYSCALL_64_after_hwframe+0x3d [kernel]
    	__write_nocancel+0x7 [libc-2.23.so]
    	[unknown]

Udev ๊ทœ์น™์€ ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ํ†ต์ œ๋œ ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฏธ ์„ค์ •๋œ ๊ฐ’์„ ์ ์šฉํ•ด๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋””์Šคํฌ๋กœ ์š”์ฒญ์„ ์ „์†กํ•˜๋Š” ๋ฐ ์ง€์—ฐ์ด ๊ธ‰์ฆํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋””์Šคํฌ ๊ตฌ์„ฑ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์—†์„ ๋•Œ(์˜ˆ: ์žฅ์น˜๊ฐ€ ๋งˆ์šดํŠธ/์—ฐ๊ฒฐ ํ•ด์ œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) udev ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ปค๋„์ด ๋ถˆํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์š”์ฒญ ๋Œ€๊ธฐ์—ด์„ ๋™๊ฒฐํ•˜๋„๋ก ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ ์ž‘์€ ์ €์ง€๋ฅด๋‹ค ์ƒํ™ฉ์„ ๋ฐ”๋กœ์žก์•„๋ผ.

๊ฒฐ๋ก 

eBPF๋Š” ๋งค์šฐ ์œ ์—ฐํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ์—์„œ ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ ์‹ค์ œ ์‚ฌ๋ก€๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์˜ ์ž‘์€ ๋ถ€๋ถ„์„ ์‹œ์—ฐํ–ˆ์Šต๋‹ˆ๋‹ค. BCC ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ฐœ๋ฐœ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ, ๊ธฐ๋ณธ ์‚ฌํ•ญ์„ ์ž˜ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

eBPF๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ํฅ๋ฏธ๋กœ์šด ๋””๋ฒ„๊น… ๋ฐ ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ํ•˜๋‚˜ - bpftrace๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด awk์™€ ์œ ์‚ฌํ•œ ์–ธ์–ด๋กœ ๊ฐ•๋ ฅํ•œ ํ•œ ์ค„์งœ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ž‘์€ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ - ebpf_exporter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Prometheus ์„œ๋ฒ„์— ์ง์ ‘ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๊ณ ํ•ด์ƒ๋„ ์ธก์ •ํ•ญ๋ชฉ์„ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋‚˜์ค‘์— ์•„๋ฆ„๋‹ค์šด ์‹œ๊ฐํ™”์™€ ์•Œ๋ฆผ๊นŒ์ง€ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€