eBPF/BCC เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‰เชšเซเชš Ceph เชฒเซ‡เชŸเชจเซเชธเซ€เชฅเซ€ เช•เชฐเซเชจเชฒ เชชเซ‡เชš เชธเซเชงเซ€

eBPF/BCC เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‰เชšเซเชš Ceph เชฒเซ‡เชŸเชจเซเชธเซ€เชฅเซ€ เช•เชฐเซเชจเชฒ เชชเซ‡เชš เชธเซเชงเซ€

Linux เชชเชพเชธเซ‡ เช•เชฐเซเชจเชฒ เช…เชจเซ‡ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซ‡ เชกเซ€เชฌเช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชธเชพเชงเชจเซ‹ เช›เซ‡. เชคเซ‡เชฎเชพเช‚เชจเชพ เชฎเซ‹เชŸเชพ เชญเชพเช—เชจเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€ เชชเชฐ เชจเช•เชพเชฐเชพเชคเซเชฎเช• เช…เชธเชฐ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช‰เชคเซเชชเชพเชฆเชจเชฎเชพเช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€.

เชตเชฐเซเชทเซ‹ เชชเชนเซ‡เชฒเชพ เชคเซเชฏเชพเช‚ เชนเชคเซ‹ เชฌเซ€เชœเซเช‚ เชธเชพเชงเชจ เชตเชฟเช•เชธเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ - eBPF. เชคเซ‡ เช•เชฐเซเชจเชฒ เช…เชจเซ‡ เชฏเซเชเชฐ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเชจเซ‡ เช“เช›เชพ เช“เชตเชฐเชนเซ‡เชก เชธเชพเชฅเซ‡ เช…เชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชฌเชจเชพเชตเชตเชพเชจเซ€ เช…เชจเซ‡ เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชคเซƒเชคเซ€เชฏ-เชชเช•เซเชท เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชฒเซ‹เชก เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชตเช—เชฐ เชŸเซเชฐเซ‡เชธ เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เชคเซเชฏเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช˜เชฃเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เช›เซ‡ เชœเซ‡ eBPF เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เช† เชฒเซ‡เช–เชฎเชพเช‚ เช…เชฎเซ‡ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเชพ เช†เชงเชพเชฐเซ‡ เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เชชเซเชฐเซ‹เชซเชพเช‡เชฒเชฟเช‚เช— เชฏเซเชŸเชฟเชฒเชฟเชŸเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเซ€ เชคเซ‡ เชœเซ‹เชˆเชถเซเช‚. เชชเชพเชฏเชฅเซ‹เชจเชฌเซ€เชธเซ€เชธเซ€. เชฒเซ‡เช– เชตเชพเชธเซเชคเชตเชฟเช• เช˜เชŸเชจเชพเช“ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เชšเซ‹เช•เซเช•เชธ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“เชฎเชพเช‚ เชตเชฐเซเชคเชฎเชพเชจ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡ เชคเซ‡ เชฌเชคเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชธเชฎเชธเซเชฏเชพเชฎเชพเช‚เชฅเซ€ เช เซ€เช• เช•เชฐเชตเชพ เชœเชˆเชถเซเช‚.

เชธเซ‡เชซ เชงเซ€เชฎเซเช‚ เช›เซ‡

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 เชฏเซเช‡เชตเซ‡เชจเซเชŸเซเชธ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชคเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เช…เชฎเซ‡ เชคเซ‡เชฎเชจเซ‡ เชœเซ‹เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซเชฏเซเช‚ udevadm เชฎเซ‹เชจเชฟเชŸเชฐ. เชคเซ‡ เชคเชพเชฐเชฃ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชฆเชฐเซ‡เช• เชฌเซเชฒเซ‹เช• เช‰เชชเช•เชฐเชฃ เชฎเชพเชŸเซ‡ เชฎเซ‹เชŸเซ€ เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐเชจเซ€ เช˜เชŸเชจเชพเช“ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เช† เชคเชฆเซเชฆเชจ เช…เชธเชพเชฎเชพเชจเซเชฏ เช›เซ‡, เชคเซ‡เชฅเซ€ เช†เชชเชฃเซ‡ เช† เชฌเชงเซ€ เช˜เชŸเชจเชพเช“ เชถเซเช‚ เชชเซ‡เชฆเชพ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชœเซ‹เชตเชพเชจเซเช‚ เชฐเชนเซ‡เชถเซ‡.

BCC เชŸเซ‚เชฒเช•เซ€เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹

เชœเซ‡เชฎ เช†เชชเชฃเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชถเซ‹เชงเซ€ เช•เชพเชขเซเชฏเซเช‚ เช›เซ‡, เช•เชฐเซเชจเชฒ (เช…เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช•เซ‹เชฒเชฎเชพเช‚ เชธเซ‡เชซ เชกเชฟเชฎเชจ) เช˜เชฃเซ‹ เชธเชฎเชฏ เชตเชฟเชคเชพเชตเซ‡ เช›เซ‡. generic_make_request(). เชšเชพเชฒเซ‹ เช† เช•เชพเชฐเซเชฏเชจเซ€ เชเชกเชชเชจเซ‡ เชฎเชพเชชเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช. IN เชฌเซ€เชธเซ€เชธเซ€ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชเช• เช…เชฆเซเชญเซเชค เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช›เซ‡ - เชซเช‚เช•เชฒเซ‡เชŸเชจเซเชธเซ€. เช…เชฎเซ‡ เช†เช‰เชŸเชชเซเชŸ เชตเชšเซเชšเซ‡ 1 เชธเซ‡เช•เชจเซเชกเชจเชพ เช…เช‚เชคเชฐเชพเชฒ เชธเชพเชฅเซ‡ เชคเซ‡เชจเชพ PID เชฆเซเชตเชพเชฐเชพ เชกเชฟเชฎเชจเชจเซ‡ เชŸเซเชฐเซ‡เชธ เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎ เชฎเชฟเชฒเชฟเชธเซ‡เช•เชจเซเชกเชฎเชพเช‚ เช†เช‰เชŸเชชเซเชŸ เช•เชฐเซ€เชถเซเช‚.

eBPF/BCC เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‰เชšเซเชš Ceph เชฒเซ‡เชŸเชจเซเชธเซ€เชฅเซ€ เช•เชฐเซเชจเชฒ เชชเซ‡เชš เชธเซเชงเซ€
เช† เชธเซเชตเชฟเชงเชพ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชเชกเชชเชฅเซ€ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เชซเช•เซเชค เช‰เชชเช•เชฐเชฃ เชกเซเชฐเชพเช‡เชตเชฐ เช•เชคเชพเชฐเชฎเชพเช‚ เชตเชฟเชจเช‚เชคเซ€ เชชเชธเชพเชฐ เช•เชฐเซ‡ เช›เซ‡.

Bcache เชเช• เชœเชŸเชฟเชฒ เช‰เชชเช•เชฐเชฃ เช›เซ‡ เชœเซ‡ เชตเชพเชธเซเชคเชตเชฎเชพเช‚ เชคเซเชฐเชฃ เชกเชฟเชธเซเช• เชงเชฐเชพเชตเซ‡ เช›เซ‡:

  • เชฌเซ‡เช•เชฟเช‚เช— เชกเชฟเชตเชพเช‡เชธ (เช•เซ‡เชถเซเชก เชกเชฟเชธเซเช•), เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชคเซ‡ เชงเซ€เชฎเซ€ HDD เช›เซ‡;
  • เช•เซ‡เชถเซ€เช‚เช— เช‰เชชเช•เชฐเชฃ (เช•เซ‡เชถเซ€เช‚เช— เชกเชฟเชธเซเช•), เช…เชนเซ€เช‚ เช† NVMe เช‰เชชเช•เชฐเชฃเชจเซเช‚ เชเช• เชชเชพเชฐเซเชŸเซ€เชถเชจ เช›เซ‡;
  • bcache เชตเชฐเซเชšเซเชฏเซเช…เชฒ เช‰เชชเช•เชฐเชฃ เช•เซ‡ เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชšเชพเชฒเซ‡ เช›เซ‡.

เช…เชฎเซ‡ เชœเชพเชฃเซ€เช เช›เซ€เช เช•เซ‡ เชตเชฟเชจเช‚เชคเซ€ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชงเซ€เชฎเซเช‚ เช›เซ‡, เชชเชฐเช‚เชคเซ เช†เชฎเชพเช‚เชฅเซ€ เช•เชฏเชพ เช‰เชชเช•เชฐเชฃเซ‹ เชฎเชพเชŸเซ‡? เช…เชฎเซ‡ เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€ เช† เชธเชพเชฅเซ‡ เชตเซเชฏเชตเชนเชพเชฐ เช•เชฐเซ€เชถเซเช‚.

เช…เชฎเซ‡ เชนเชตเซ‡ เชœเชพเชฃเซ€เช เช›เซ€เช เช•เซ‡ uevents เชธเชฎเชธเซเชฏเชพเช“เชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡. เชคเซ‡เชฎเชจเซ€ เชชเซ‡เชขเซ€เชจเซเช‚ เชšเซ‹เช•เซเช•เชธ เช•เชพเชฐเชฃ เชถเซเช‚ เช›เซ‡ เชคเซ‡ เชถเซ‹เชงเชตเซเช‚ เชเชŸเชฒเซเช‚ เชธเชฐเชณ เชจเชฅเซ€. เชšเชพเชฒเซ‹ เชฎเชพเชจเซ€ เชฒเชˆเช เช•เซ‡ เช† เช…เชฎเซเช• เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เช›เซ‡ เชœเซ‡ เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ เชฒเซ‹เชจเซเชš เชฅเชพเชฏ เช›เซ‡. เชšเชพเชฒเซ‹ เชœเซ‹เชˆเช เช•เซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เช•เชฏเชพ เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชšเชพเชฒเซ‡ เช›เซ‡ execsnoop เช เชœ เชฅเซ€ 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 เชšเชฒเชพเชตเซ€เชจเซ‡, uevents เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ udevadm เชŸเซเชฐเชฟเช—เชฐ เชšเชฒเชพเชตเซ€เชจเซ‡ เชธเชฎเชธเซเชฏเชพเชจเซเช‚ เชชเซเชจเชƒเช‰เชคเซเชชเชพเชฆเชจ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซเชฏเซ‹ เช›เซ‡.

BCC-เช†เชงเชพเชฐเชฟเชค เชธเชพเชงเชจเซ‹ เชฒเซ‡เช–เชจ

เชšเชพเชฒเซ‹ เชธเซŒเชฅเซ€ เชงเซ€เชฎเชพ เช•เซ‰เชฒเซเชธเชจเซ‡ เชŸเซเชฐเซ‡เชธ เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชธเชฐเชณ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชฒเช–เชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช generic_make_request(). เช…เชฎเซ‡ เชกเซเชฐเชพเช‡เชตเชจเชพ เชจเชพเชฎเชฎเชพเช‚ เชชเชฃ เชฐเชธ เชงเชฐเชพเชตเซ€เช เช›เซ€เช เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช† เชซเช‚เช•เซเชถเชจ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚.

เชฏเซ‹เชœเชจเชพ เชธเชฐเชณ เช›เซ‡:

  • เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹ kprobe เชชเชฐ generic_make_request():
    • เช…เชฎเซ‡ เชกเชฟเชธเซเช• เชจเชพเชฎเชจเซ‡ เชฎเซ‡เชฎเชฐเซ€เชฎเชพเช‚ เชธเชพเชšเชตเซ€เช เช›เซ€เช, เชซเช‚เช•เซเชถเชจ เชฆเชฒเซ€เชฒ เชฆเซเชตเชพเชฐเชพ เชธเซเชฒเชญ;
    • เช…เชฎเซ‡ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เชธเชพเชšเชตเซ€เช เช›เซ€เช.

  • เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเซ‹ kretprobe เชฅเซ€ เชชเชฐเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ generic_make_request():
    • เช…เชฎเชจเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เชฎเชณเซ‡ เช›เซ‡;
    • เช…เชฎเซ‡ เชธเชพเชšเชตเซ‡เชฒ เชŸเชพเช‡เชฎเชธเซเชŸเซ‡เชฎเซเชช เชถเซ‹เชงเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชตเชฐเซเชคเชฎเชพเชจ เชธเชพเชฅเซ‡ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเซ€เช เช›เซ€เช;
    • เชœเซ‹ เชชเชฐเชฟเชฃเชพเชฎ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช•เชฐเชคเชพ เชตเชงเชพเชฐเซ‡ เชนเซ‹เชฏ, เชคเซ‹ เช…เชฎเซ‡ เชธเชพเชšเชตเซ‡เชฒ เชกเชฟเชธเซเช• เชจเชพเชฎ เชถเซ‹เชงเซ€เช เช›เซ€เช เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชŸเชฐเซเชฎเชฟเชจเชฒ เชชเชฐ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ€เช เช›เซ€เช.

Kprobes ะธ kretprobes เชซเซเชฒเชพเชฏ เชชเชฐ เชซเช‚เช•เซเชถเชจ เช•เซ‹เชก เชฌเชฆเชฒเชตเชพ เชฎเชพเชŸเซ‡ เชฌเซเชฐเซ‡เช•เชชเซ‹เช‡เชจเซเชŸ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹. เชคเชฎเซ‡ เชตเชพเช‚เชšเซ€ เชถเช•เซ‹ เช›เซ‹ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ ะธ เชธเชพเชฐเซเช‚ เช† เชตเชฟเชทเชฏ เชชเชฐ เชฒเซ‡เช–. เชœเซ‹ เชคเชฎเซ‡ เชฎเชพเช‚ เชตเชฟเชตเชฟเชง เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเชพ เช•เซ‹เชก เชœเซเช“ เชฌเซ€เชธเซ€เชธเซ€, เชชเช›เซ€ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชคเซ‡เชฎเชจเซ€ เชชเชพเชธเซ‡ เชธเชฎเชพเชจ เชฎเชพเชณเช–เซเช‚ เช›เซ‡. เชคเซ‡เชฅเซ€ เช† เชฒเซ‡เช–เชฎเชพเช‚ เช†เชชเชฃเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฆเชฒเซ€เชฒเซ‹เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‹เชกเซ€ เชฆเชˆเชถเซเช‚ เช…เชจเซ‡ BPF เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชชเชฐ เชœ เช†เช—เชณ เชตเชงเซ€เชถเซเช‚.

เชชเชพเชฏเชฅเซ‹เชจ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ€ เช…เช‚เชฆเชฐ 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 เช…เชจเซ‡ เชชเซเชฐเช•เชพเชฐเชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชกเซ‡เชŸเชพ_เชŸเซ€. เชŸเซ‡เชฌเชฒ เช…เชฎเชพเชฐเชพ 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 เช…เชจเซ‡ เชจเซ‡เชจเซ‹เชธเซ‡เช•เชจเซเชกเชฎเชพเช‚ เชตเชฐเซเชคเชฎเชพเชจ เชŸเชพเชˆเชฎเชธเซเชŸเซ‡เชฎเซเชช เชฎเซ‡เชณเชตเซ€เช เช›เซ€เช. เช…เชฎเซ‡ เชคเซ‡ เชฌเชงเซเช‚ เชคเชพเชœเซ€ เชชเชธเช‚เชฆ เช•เชฐเซ‡เชฒเชพเชฎเชพเช‚ เชฒเช–เซ€เช เช›เซ€เช เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชกเซ‡เชŸเชพ_เชŸเซ€ เชกเซ‡เชŸเชพ. เช…เชฎเชจเซ‡ เชธเซเชŸเซเชฐเช•เซเชšเชฐเชฎเชพเช‚เชฅเซ€ เชกเชฟเชธเซเช•เชจเซเช‚ เชจเชพเชฎ เชฎเชณเซ‡ เช›เซ‡ เชฌเชพเชฏเซ‹, เชœเซ‡ เช•เซ‰เชฒ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชชเชธเชพเชฐ เชฅเชพเชฏ เช›เซ‡ 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.

เชชเชพเชฏเชฅเซ‹เชจ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชœเซ‡ เช† เช•เซ‹เชกเชจเซ‡ เชฒเซ‹เชก เช•เชฐเชถเซ‡, เช…เชฎเชพเชฐเซ‡ 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")

เช†เชชเชฃเซ‡ เชชเชฃ เชจเช•เซเช•เซ€ เช•เชฐเชตเซเช‚ เชชเชกเชถเซ‡ เชธเซเชŸเซเชฐเช•เซเชšเชฐ เชกเซ‡เชŸเชพ_เชŸเซ€ เช…เชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚, เช…เชจเซเชฏเชฅเชพ เช…เชฎเซ‡ เช•เช‚เชˆเชชเชฃ เชตเชพเช‚เชšเซ€ เชถเช•เซ€เชถเซเช‚ เชจเชนเซ€เช‚:

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(), เชœเซ‡ เชเช• เชฐเชธเชชเซเชฐเชฆ เชชเชกเช•เชพเชฐ เชงเชฐเชพเชตเซ‡ เช›เซ‡ เชฐเชพเชน_เช˜เชŸเชจเชพ_เชตเชฟเช•เซเชทเซ‡เชชเช•เชพเชฐเช•():

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_depth. เช† เชชเช›เซ€, เช•เชฐเซเชจเชฒ เช•เชคเชพเชฐเชฎเชพเช‚ เช–เชพเชฒเซ€ เชฅเชตเชพเชจเซ€ เชฐเชพเชน เชœเซเช เช›เซ‡ blk_mq_freeze_queue_wait().

เช† เช•เชคเชพเชฐเชจเซ‡ เชธเชพเชซ เช•เชฐเชตเชพเชฎเชพเช‚ เชœเซ‡ เชธเชฎเชฏ เชฒเชพเช—เซ‡ เช›เซ‡ เชคเซ‡ เชกเชฟเชธเซเช• เชฒเซ‡เชŸเชจเซเชธเซ€เชจเซ€ เชธเชฎเช•เช•เซเชท เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เช•เชฐเซเชจเชฒ เชคเชฎเชพเชฎ เช•เชคเชพเชฐเชฌเชฆเซเชง เช•เชพเชฎเช—เซ€เชฐเซ€ เชชเซ‚เชฐเซเชฃ เชฅเชตเชพเชจเซ€ เชฐเชพเชน เชœเซเช เช›เซ‡. เชเช•เชตเชพเชฐ เช•เชคเชพเชฐ เช–เชพเชฒเซ€ เชฅเชˆ เชœเชพเชฏ, เชชเช›เซ€ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชฒเชพเช—เซ เชฅเชพเชฏ เช›เซ‡. เชœเซ‡ เชชเช›เซ€ เชคเซ‡เชจเซ‡ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ blk_mq_unfreeze_queue(), เช•เชพเช‰เชจเซเชŸเชฐ เช˜เชŸเชพเชกเชตเซเช‚ เชซเซเชฐเซ€เช_เชกเซ‡เชชเซเชฅ.

เชนเชตเซ‡ เช†เชชเชฃเซ‡ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซ€ เชœเชพเชฃเซ€เช เช›เซ€เช. udevadm เชŸเซเชฐเชฟเช—เชฐ เช†เชฆเซ‡เชถ เชฌเซเชฒเซ‹เช• เช‰เชชเช•เชฐเชฃ เชฎเชพเชŸเซ‡ เชธเซเชฏเซ‹เชœเชจเซ‹เชจเซ‡ เชฒเชพเช—เซ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡. เช† เชธเซ‡เชŸเชฟเช‚เช—เซเชธ 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, เชคเชฎเชจเซ‡ เชชเช›เซ€เชฅเซ€ เชธเซเช‚เชฆเชฐ เชตเชฟเชเซเชฏเซเชฒเชพเช‡เชเซ‡เชถเชจ เช…เชจเซ‡ เชšเซ‡เชคเชตเชฃเซ€เช“ เชชเชฃ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ เชธเชพเชฅเซ‡, เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เชฎเชฟเชฅเชฟเชฏเชธ เชธเชฐเซเชตเชฐเชฎเชพเช‚ เชธเซ€เชงเชพ เชœ เชจเซ€เชšเชฒเชพ-เชธเซเชคเชฐเชจเชพ, เช‰เชšเซเชš-เชฐเชฟเชเซ‹เชฒเซเชฏเซเชถเชจ เชฎเซ‡เชŸเซเชฐเชฟเช•เซเชธ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹