Linux์๋ ์ปค๋๊ณผ ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ฒ๊น
ํ๊ธฐ ์ํ ์๋ง์ ๋๊ตฌ๊ฐ ์์ต๋๋ค. ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์
์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ฉฐ ํ๋ก๋์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ช ๋
์ ์๋
eBPF๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํธ๋ฆฌํฐ๋ ์ด๋ฏธ ๋ง์ด ์์ผ๋ฉฐ, ์ด ๊ธฐ์ฌ์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ๋ง์ ํ๋กํ์ผ๋ง ์ ํธ๋ฆฌํฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ธํ๋ ๋๋ฆฌ๋ค
Ceph ํด๋ฌ์คํฐ์ ์ ํธ์คํธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ์ฐ๊ธฐ ์์ฒญ ์ฒ๋ฆฌ ์๋๊ฐ ๋ค๋ฅธ ์๋ฒ๋ณด๋ค ํจ์ฌ ๋ฎ๋ค๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
๋ค๋ฅธ ํ๋ซํผ๊ณผ ๋ฌ๋ฆฌ ์ด ํธ์คํธ๋ bcache์ ์๋ก์ด Linux 4.15 ์ปค๋์ ์ฌ์ฉํ์ต๋๋ค. ์ด ๊ตฌ์ฑ์ ํธ์คํธ๊ฐ ์ฌ๊ธฐ์์ ์ฌ์ฉ๋ ๊ฒ์ ์ด๋ฒ์ด ์ฒ์์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์๊ฐ ๋ฌธ์ ์ ๊ทผ๋ณธ ์์ธ์ ์ด๋ก ์ ์ผ๋ก ๋ฌด์์ด๋ ๋ ์ ์๋ค๋ ๊ฒ์ด ๋ถ๋ช
ํด์ก์ต๋๋ค.
ํธ์คํธ ์กฐ์ฌ
๋จผ์ ceph-osd ํ๋ก์ธ์ค ๋ด๋ถ์์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋
๊ทธ๋ฆผ์ ์ฐ๋ฆฌ์๊ฒ ๊ธฐ๋ฅ์ ์๋ ค์ค๋๋ค fdatasync() ํจ์์ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐ ๋ง์ ์๊ฐ์ ์๋นํ์ต๋๋ค. generic_make_request(). ์ด๋ ๋ฌธ์ ์ ์์ธ์ด osd ๋ฐ๋ชฌ ์์ฒด ์ธ๋ถ์ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ปค๋์ผ ์๋ ์๊ณ ๋์คํฌ์ผ ์๋ ์์ต๋๋ค. iostat ์ถ๋ ฅ์์๋ bcache ๋์คํฌ์ ์์ฒญ ์ฒ๋ฆฌ ์ ๋์ ๋๊ธฐ ์๊ฐ์ด ๋ํ๋ฌ์ต๋๋ค.
ํธ์คํธ๋ฅผ ๊ฒ์ฌํ ๋ systemd-udevd ๋ฐ๋ชฌ์ด ๋ง์ ์์ CPU ์๊ฐ(์ฌ๋ฌ ์ฝ์ด์์ ์ฝ 20%)์ ์๋นํ๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด๋ ์ด์ํ ๋์์ด๋ฏ๋ก ์ด์ ๋ฅผ ์์๋ด์ผ ํฉ๋๋ค. Systemd-udevd๋ uevent์ ํจ๊ป ์๋ํ๋ฏ๋ก ์ฐ๋ฆฌ๋ ์ด๋ฅผ ํตํด ์ดํด๋ณด๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. udevadm ๋ชจ๋ํฐ. ์์คํ ์ ๊ฐ ๋ธ๋ก ์ฅ์น์ ๋ํด ๋ง์ ์์ ๋ณ๊ฒฝ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด๋ ๋งค์ฐ ํน์ดํ ํ์์ด๋ฏ๋ก ๋ฌด์์ด ์ด๋ฌํ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋์ง ์ดํด๋ด์ผ ํฉ๋๋ค.
BCC ํดํท ์ฌ์ฉ
์ฐ๋ฆฌ๊ฐ ์ด๋ฏธ ์์๋ธ ๋ฐ์ ๊ฐ์ด ์ปค๋(๋ฐ ์์คํ
ํธ์ถ์ ceph ๋ฐ๋ชฌ)์ ๋ค์ ์์
์ ๋ง์ ์๊ฐ์ ์๋นํฉ๋๋ค. generic_make_request(). ์ด ๊ธฐ๋ฅ์ ์๋๋ฅผ ์ธก์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์์
์ด ๊ธฐ๋ฅ์ ์ผ๋ฐ์ ์ผ๋ก ๋น ๋ฅด๊ฒ ์๋ํฉ๋๋ค. ๊ทธ๊ฒ์ด ํ๋ ์ผ์ ์์ฒญ์ ์ฅ์น ๋๋ผ์ด๋ฒ ํ์ ์ ๋ฌํ๋ ๊ฒ๋ฟ์
๋๋ค.
์บ์ ์ค์ ๋ก ์ธ ๊ฐ์ ๋์คํฌ๋ก ๊ตฌ์ฑ๋ ๋ณต์กํ ์ฅ์น์ ๋๋ค.
- ๋ฐฑ์ ์ฅ์น(์บ์๋ ๋์คํฌ), ์ด ๊ฒฝ์ฐ์๋ ๋๋ฆฐ HDD์ ๋๋ค.
- ์บ์ฑ ์ฅ์น(์บ์ฑ ๋์คํฌ), ์ฌ๊ธฐ์๋ NVMe ์ฅ์น์ ํ ํํฐ์ ์ ๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ bcache ๊ฐ์ ์ฅ์น์ ๋๋ค.
์์ฒญ ์ ์ก ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ์ฅ์น ์ค ์ด๋ค ์ฅ์น์ ๋ํ ๊ฒ์ผ๊น์? ์ด ๋ฌธ์ ๋ ์ ์ ํ์ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ uevent๊ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ธ๋์ ์์ธ์ ์ ํํ ์ฐพ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ฌ์ด ์ผ์ด ์๋๋๋ค. ์ด๊ฒ์ด ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ๋๋ ์ผ์ข
์ ์ํํธ์จ์ด๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์คํ
์์ ์ด๋ค ์ข
๋ฅ์ ์ํํธ์จ์ด๊ฐ ์คํ๋๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์์ ๊ฐ์ ๊ฒ์์
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
/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 ะธ ํฌ๋ ํธํ๋ก๋ธ ์ค๋จ์ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ์ฆ์ ํจ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ๋น์ ์ ์ฝ์ ์์๋ค
Python ์คํฌ๋ฆฝํธ ๋ด๋ถ์ eBPF ํ ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
bpf_text = โโโ # Here will be the bpf program code โโโ
ํจ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ธฐ ์ํด eBPF ํ๋ก๊ทธ๋จ์ ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
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():
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์
๋๋ค. ์ฐ๋ฆฌ๊ฐ ํธ์ถํ๋ ํจ์
ํฐ๋ฏธ๋๋ก ์ถ๋ ฅํ ๋ ํ์ฌ ์ค๋ ๋์๋ ๊ด์ฌ์ด ์์ง๋ง ๊ธฐ๋ณธ ํ๋ก์ธ์ค์๋ ๊ด์ฌ์ด ์์ต๋๋ค. ๊ฒฐ๊ณผ ์ง์ฐ์ ์ฃผ์ด์ง ์๊ณ๊ฐ๊ณผ ๋น๊ตํ ํ ๊ตฌ์กฐ๋ฅผ ์ ๋ฌํฉ๋๋ค. ๋ฐ์ดํฐ ํ ์ด๋ธ์ ํตํด ์ฌ์ฉ์ ๊ณต๊ฐ์ผ๋ก ์ด๋ฒคํธ, ๊ทธ ํ์ ํญ๋ชฉ์ ์ญ์ ํฉ๋๋ค. 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 ํ๋ก๊ทธ๋จ์ ์ค๋นํด์ผ ํฉ๋๋ค.
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()
์คํฌ๋ฆฝํธ ์์ฒด๋ ๋ค์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก! ์ด์ ์ฐ๋ฆฌ๋ ์ง์ฐ๋ bcache ์ฅ์น์ฒ๋ผ ๋ณด์์ง๋ง ์ค์ ๋ก๋ ์ง์ฐ๋ ํธ์ถ์์ ์ ์ ์์ต๋๋ค. generic_make_request() ์บ์๋ ๋์คํฌ์ ๊ฒฝ์ฐ.
์ปค๋์ ์์ธํ ์ดํด๋ณด์ธ์
์์ฒญ ์ ์ก ์ค์ ์๋๊ฐ ๋๋ ค์ง๋ ๊ฒ์ ์ ํํ ๋ฌด์์
๋๊น? ์์ฒญ ํ๊ณ๊ฐ ์์๋๊ธฐ ์ ์๋ ์ง์ฐ์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด์ ๋ํ ์ถ๊ฐ ํต๊ณ ์ถ๋ ฅ์ ๋ํ ํน์ ์์ฒญ(/proc/diskstats ๋๋ iostat)์ ๋ํ ์ค๋ช
์ด ์์ง ์์๋์ง ์์์ต๋๋ค. ์ด๋ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ๋์ iostat๋ฅผ ์คํํ์ฌ ์ฝ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
๊ธฐ๋ฅ์ ์ดํด๋ณด๋ฉด generic_make_request(), ๊ทธ๋ฌ๋ฉด ์์ฒญ์ด ๊ณ์ฐ์ ์์ํ๊ธฐ ์ ์ ๋ ๊ฐ์ ํจ์๊ฐ ๋ ํธ์ถ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ - generic_make_request_checks(), ๋์คํฌ ์ค์ ๊ณผ ๊ด๋ จ๋ ์์ฒญ์ ์ ๋ฒ์ฑ์ ํ์ธํฉ๋๋ค. ๋๋ฒ์งธ -
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 | |
์ฐ๋ฆฌ๋ ํด๊ฒฐ์ฑ
์ ๊ฐ๊น์์ง ๊ฒ ๊ฐ์ต๋๋ค. ๋๊ธฐ์ด์ ๊ณ ์ /๊ณ ์ ํด์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๋๊ธฐ์ด์ ์ง์ฐ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ปค๋์ด ๋๊ธฐ์ด์ ์๋ ๋ชจ๋ ์์
์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋์คํฌ ๋๊ธฐ ์๊ฐ๊ณผ ๋์ผํฉ๋๋ค. ๋๊ธฐ์ด์ด ๋น์ด ์์ผ๋ฉด ์ค์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋ฉ๋๋ค. ๊ทธ ํ์๋
์ด์ ์ฐ๋ฆฌ๋ ์ํฉ์ ๋ฐ๋ก์ก์ ๋งํผ ์ถฉ๋ถํ ์๊ณ ์์ต๋๋ค. udevadm Trigger ๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ๋ธ๋ก ์ฅ์น์ ๋ํ ์ค์ ์ด ์ ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ์ค์ ์ udev ๊ท์น์ ์ค๋ช
๋์ด ์์ต๋๋ค. sysfs๋ฅผ ํตํด ์ค์ ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ปค๋ ์์ค ์ฝ๋๋ฅผ ์ดํด๋ด์ผ๋ก์จ ๋๊ธฐ์ด์ ์ ์ง์ํค๋ ์ค์ ์ ์ฐพ์ ์ ์์ต๋๋ค. BCC ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํด ๋ณผ ์๋ ์์ต๋๋ค.
~# /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๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๋๋ฒ๊น
๋ฐ ํ๋กํ์ผ๋ง ๋๊ตฌ๊ฐ ์์ต๋๋ค. ๊ทธ๋ค ์ค ํ๋ -
์ถ์ฒ : habr.com