eBPF/BCC เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดฏเตผเดจเตเดจ เดธเต†เดซเต เดฒเต‡เดฑเตเดฑเตปเดธเดฟ เดฎเตเดคเตฝ เด•เต‡เตผเดฃเตฝ เดชเดพเดšเตเดšเต เดตเดฐเต†

eBPF/BCC เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดฏเตผเดจเตเดจ เดธเต†เดซเต เดฒเต‡เดฑเตเดฑเตปเดธเดฟ เดฎเตเดคเตฝ เด•เต‡เตผเดฃเตฝ เดชเดพเดšเตเดšเต เดตเดฐเต†

เด•เต‡เตผเดฃเดฒเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเด‚ เดกเต€เดฌเด—เตเด—เต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดฒเดฟเดจเด•เตเดธเดฟเดจเต เดงเดพเดฐเดพเดณเด‚ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เด‰เดฃเตเดŸเต. เด…เดตเดฏเดฟเตฝ เดฎเดฟเด•เตเด•เดคเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเตเดฐเด•เดŸเดจเดคเตเดคเต† เดชเตเดฐเดคเดฟเด•เต‚เดฒเดฎเดพเดฏเดฟ เดฌเดพเดงเดฟเด•เตเด•เตเดจเตเดจเต, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เด‰เตฝเดชเตเดชเดพเดฆเดจเดคเตเดคเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.

เด•เตเดฑเดšเตเดšเต เดตเตผเดทเด™เตเด™เตพเด•เตเด•เต เดฎเตเดฎเตเดชเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต เดฎเดฑเตเดฑเตŠเดฐเต เด‰เดชเด•เดฐเดฃเด‚ เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเดšเตเดšเต†เดŸเตเดคเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต - เด‡.เดฌเดฟ.เดชเดฟ.เดŽเดซเต. เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเดคเต†เดฏเตเด‚ เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฎเต‚เดจเตเดจเดพเด‚ เด•เด•เตเดทเดฟ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เตพ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเดพเดคเต†เดฏเตเด‚ เด•เตเดฑเดžเตเดž เด“เดตเตผเดนเต†เดกเดฟเตฝ เด•เต‡เตผเดฃเดฒเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เดณเตเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเต เดธเดพเดงเตเดฏเดฎเดพเด•เตเด•เตเดจเตเดจเต.

เด‡เดฌเดฟเดชเดฟเดŽเดซเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดจเดฟเดฐเดตเดงเดฟ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เด‡เดคเดฟเดจเด•เด‚ เด‰เดฃเตเดŸเต, เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดฒเตˆเดฌเตเดฐเดฑเดฟเดฏเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดชเตเดฐเตŠเดซเตˆเดฒเดฟเด‚เด—เต เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เดŽเด™เตเด™เดจเต† เดŽเดดเตเดคเดพเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดจเต‹เด•เตเด•เตเด‚. เดชเตˆเดคเตเดคเตบเดฌเดฟเดธเดฟเดธเดฟ. เดฏเดฅเดพเตผเดคเตเดฅ เดธเด‚เดญเดตเด™เตเด™เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณเดคเดพเดฃเต เดฒเต‡เด–เดจเด‚. เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดธเดพเดนเดšเดฐเตเดฏเด™เตเด™เดณเดฟเตฝ เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เด•เดพเดฃเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพ เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเตป เดชเต‹เด•เตเด‚.

เดธเต†เดซเต เดˆเดธเต เดธเตเดฒเต‹

เดธเต†เดซเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดชเตเดคเดฟเดฏ เดนเต‹เดธเตเดฑเตเดฑเต เดšเต‡เตผเดคเตเดคเต. เด…เดคเดฟเดฒเต‡เด•เตเด•เต เด•เตเดฑเดšเตเดšเต เดกเดพเดฑเตเดฑ เดฎเตˆเด—เตเดฐเต‡เดฑเตเดฑเต เดšเต†เดฏเตโ€Œเดคเดคเดฟเดจเต เดถเต‡เดทเด‚, เด…เดคเต เดตเดดเดฟเดฏเตเดณเตเดณ เดฑเตˆเดฑเตเดฑเต เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เดตเต‡เด—เดค เดฎเดฑเตเดฑเต เดธเต†เตผเดตเดฑเตเด•เดณเต† เด…เดชเต‡เด•เตเดทเดฟเดšเตเดšเต เดตเดณเดฐเต† เด•เตเดฑเดตเดพเดฃเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดถเตเดฐเดฆเตเดงเดฟเดšเตเดšเต.

eBPF/BCC เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดฏเตผเดจเตเดจ เดธเต†เดซเต เดฒเต‡เดฑเตเดฑเตปเดธเดฟ เดฎเตเดคเตฝ เด•เต‡เตผเดฃเตฝ เดชเดพเดšเตเดšเต เดตเดฐเต†
เดฎเดฑเตเดฑเต เดชเตเดฒเดพเดฑเตเดฑเตโ€Œเดซเต‹เดฎเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ, เดˆ เดนเต‹เดธเตเดฑเตเดฑเต bcache เด‰เด‚ เดชเตเดคเดฟเดฏ linux 4.15 เด•เต‡เตผเดฃเดฒเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต. เด‡เดคเดพเดฆเตเดฏเดฎเดพเดฏเดพเดฃเต เดˆ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเดฑเต† เด’เดฐเต เดนเต‹เดธเตเดฑเตเดฑเต เด‡เดตเดฟเดŸเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต. เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดจเตเดฑเต† เดฎเต‚เดฒเด•เดพเดฐเดฃเด‚ เดธเตˆเดฆเตเดงเดพเดจเตเดคเดฟเด•เดฎเดพเดฏเดฟ เดŽเดจเตเดคเตเด‚ เด†เดฏเดฟเดฐเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เด† เดจเดฟเดฎเดฟเดทเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเดฏเดฟ.

เดนเต‹เดธเตเดฑเตเดฑเดฟเดจเต† เด…เดจเตเดตเต‡เดทเดฟเด•เตเด•เตเดจเตเดจเต

ceph-osd เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเด•เตเด•เตเดณเตเดณเดฟเตฝ เดŽเดจเตเดคเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดฟเด•เตเด•เตŠเดฃเตเดŸเต เดจเดฎเตเด•เตเด•เต เด†เดฐเด‚เดญเดฟเด•เตเด•เดพเด‚. เด‡เดคเดฟเดจเดพเดฏเดฟ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚ perf ะธ เดซเตเดฒเต‡เด‚เดธเตเด•เต‹เดชเตเดชเต (เด‡เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดตเดพเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ เด‡เดตเดฟเดŸเต†):

eBPF/BCC เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดฏเตผเดจเตเดจ เดธเต†เดซเต เดฒเต‡เดฑเตเดฑเตปเดธเดฟ เดฎเตเดคเตฝ เด•เต‡เตผเดฃเตฝ เดชเดพเดšเตเดšเต เดตเดฐเต†
เดšเดฟเดคเตเดฐเด‚ เดจเดฎเตเดฎเต‹เดŸเต เดชเดฑเดฏเตเดจเตเดจเต เดซเด™เตเดทเตป fdatasync() เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เดฏเดฏเตโ€Œเด•เตเด•เดพเตป เดงเดพเดฐเดพเดณเด‚ เดธเดฎเดฏเด‚ เดšเต†เดฒเดตเดดเดฟเดšเตเดšเต generic_make_request(). เด‡เดคเดฟเดจเตผเดคเตเดฅเด‚ เดฎเดฟเด•เตเด•เดตเดพเดฑเตเด‚ เดชเตเดฐเดถเตเดจเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเดฃเด‚ osd เดกเต†เดฎเดฃเดฟเดจเต เดชเตเดฑเดคเตเดคเต เดŽเดตเดฟเดŸเต†เดฏเต‹ เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚ เดŽเดจเตเดจเดพเดฃเต. เด‡เดคเต เด•เต‡เตผเดฃเดฒเต‹ เดกเดฟเดธเตเด•เตเด•เดณเต‹ เด†เด•เดพเด‚. bcache เดกเดฟเดธเตเด•เตเด•เตพ เดตเดดเดฟเดฏเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเตฝ iostat เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เด‰เดฏเตผเดจเตเดจ เดฒเต‡เดฑเตเดฑเตปเดธเดฟ เด•เดพเดฃเดฟเดšเตเดšเต.

เดนเต‹เดธเตเดฑเตเดฑเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, systemd-udevd เดกเต†เดฎเตบ เดตเดฒเดฟเดฏ เด…เดณเดตเดฟเตฝ เดธเดฟเดชเดฟเดฏเต เดธเดฎเดฏเด‚ เดšเต†เดฒเดตเดดเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฏเดฟ เดžเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดฟ - เดจเดฟเดฐเดตเดงเดฟ เด•เต‹เดฑเตเด•เดณเดฟเตฝ เดเด•เดฆเต‡เดถเด‚ 20%. เด‡เดคเตŠเดฐเต เดตเดฟเดšเดฟเดคเตเดฐเดฎเดพเดฏ เดชเต†เดฐเตเดฎเดพเดฑเตเดฑเดฎเดพเดฃเต, เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. Systemd-udevd uevents-เตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดžเด™เตเด™เตพ เด…เดต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต udevadm เดฎเต‹เดฃเดฟเดฑเตเดฑเตผ. เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต† เด“เดฐเต‹ เดฌเตเดฒเต‹เด•เตเด•เต เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดจเตเด‚ เดงเดพเดฐเดพเดณเด‚ เดฎเดพเดฑเตเดฑ เดชเดฐเดฟเดชเดพเดŸเดฟเด•เตพ เดธเตƒเดทเตเดŸเดฟเดšเตเดšเดคเดพเดฏเดฟ เด‡เดคเต เดฎเดพเดฑเตเดจเตเดจเต. เด‡เดคเต เดคเดฟเด•เดšเตเดšเตเด‚ เด…เดธเดพเดงเดพเดฐเดฃเดฎเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เดˆ เด‡เดตเดจเตเดฑเตเด•เดณเต†เดฒเตเดฒเดพเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเต เดจเดฎเตเดฎเตพ เดจเต‹เด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

BCC เดŸเต‚เตพเด•เดฟเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต

เดžเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเดคเตเดชเต‹เดฒเต†, เด•เต‡เตผเดฃเตฝ (เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เต‹เดณเดฟเดฒเต† เดธเต†เดซเต เดกเต†เดฎเตบ) เดงเดพเดฐเดพเดณเด‚ เดธเดฎเดฏเด‚ เดšเต†เดฒเดตเดดเดฟเด•เตเด•เตเดจเตเดจเต generic_make_request(). เดˆ เดซเด‚เด—เตเดทเดจเตเดฑเต† เดตเต‡เด—เดค เด…เดณเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚. IN เดฌเดฟ.เดธเดฟ.เดธเดฟ. เด‡เดคเดฟเดจเด•เด‚ เด’เดฐเต เด…เดคเตเดญเตเดคเด•เดฐเดฎเดพเดฏ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟ เด‰เดฃเตเดŸเต - เดซเตบเด•เตเดฒเต‡เดฑเตเดฑเตปเดธเดฟ. เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเตเด•เตพเด•เตเด•เดฟเดŸเดฏเดฟเดฒเตเดณเตเดณ 1 เดธเต†เด•เตเด•เตปเดกเต เด‡เดŸเดตเต‡เดณเดฏเดฟเตฝ เดžเด™เตเด™เตพ เดกเต†เดฎเดจเต† เด…เดคเดฟเดจเตเดฑเต† PID เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เดซเดฒเด‚ เดฎเดฟเดฒเตเดฒเดฟเดธเต†เด•เตเด•เตปเดกเดฟเตฝ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚.

eBPF/BCC เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดฏเตผเดจเตเดจ เดธเต†เดซเต เดฒเต‡เดฑเตเดฑเตปเดธเดฟ เดฎเตเดคเตฝ เด•เต‡เตผเดฃเตฝ เดชเดพเดšเตเดšเต เดตเดฐเต†
เดˆ เดธเดตเดฟเดถเต‡เดทเดค เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดตเต‡เด—เดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต. เดกเดฟเดตเตˆเดธเต เดกเตเดฐเตˆเดตเตผ เด•เตเดฏเต‚เดตเดฟเดฒเต‡เด•เตเด•เต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด•เตˆเดฎเดพเดฑเตเด• เดฎเดพเดคเตเดฐเดฎเดพเดฃเต เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต.

Bcache เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดฎเต‚เดจเตเดจเต เดกเดฟเดธเตเด•เตเด•เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจ เด’เดฐเต เดธเด™เตเด•เต€เตผเดฃเตเดฃ เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต:

  • เดฌเดพเด•เตเด•เดฟเด‚เด—เต เด‰เดชเด•เดฐเดฃเด‚ (เด•เดพเดทเต†เดกเต เดกเดฟเดธเตเด•เต), เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ เด‡เดคเต เด’เดฐเต เดตเต‡เด—เดค เด•เตเดฑเดžเตเดž HDD เด†เดฃเต;
  • เด•เดพเดทเดฟเด‚เด—เต เด‰เดชเด•เดฐเดฃเด‚ (เด•เดพเดทเดฟเด‚เด—เต เดกเดฟเดธเตเด•เต), เด‡เดตเดฟเดŸเต† เด‡เดคเต NVMe เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดชเดพเตผเดŸเตเดŸเต€เดทเตป เด†เดฃเต;
  • เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ bcache เดตเต†เตผเดšเตเดตเตฝ เด‰เดชเด•เดฐเดฃเด‚.

เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดธเด‚เดชเตเดฐเต‡เด•เตเดทเดฃเด‚ เดฎเดจเตเดฆเด—เดคเดฟเดฏเดฟเดฒเดพเดฃเต†เดจเตเดจเต เดžเด™เตเด™เตพเด•เตเด•เดฑเดฟเดฏเดพเด‚, เดŽเดจเตเดจเดพเตฝ เดˆ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเดฟเตฝ เดเดคเดพเดฃเต? เดžเด™เตเด™เตพ เด‡เดคเต เด•เตเดฑเดšเตเดšเต เด•เดดเดฟเดžเตเดžเต เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเด‚.

เด‡เดตเดจเตเดฑเตเด•เตพ เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เด‰เดฃเตเดŸเดพเด•เตเด•เดพเตป เดธเดพเดงเตเดฏเดคเดฏเตเดฃเตเดŸเต†เดจเตเดจเต เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเด•เตเด•เดฑเดฟเดฏเดพเด‚. เด…เดตเดฐเตเดŸเต† เดคเดฒเดฎเตเดฑเดฏเตเด•เตเด•เต เดŽเดจเตเดคเดพเดฃเต เด•เดพเดฐเดฃเดฎเดพเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เด•เดฃเตเดŸเต†เดคเตเดคเตเดจเตเดจเดคเต เด…เดคเตเดฐ เดŽเดณเตเดชเตเดชเดฎเดฒเตเดฒ. เด‡เดคเต เด†เดจเตเด•เดพเดฒเดฟเด•เดฎเดพเดฏเดฟ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเตเดคเดฐเด‚ เดธเต‹เดซเตโ€Œเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เด†เดฃเต†เดจเตเดจเต เด•เดฐเตเดคเตเด•. เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดเดคเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดธเต‹เดซเตเดฑเตเดฑเตเดตเต†เดฏเดฑเดพเดฃเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚ 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():
    • เดžเด™เตเด™เตพ เดกเดฟเดธเตเด•เดฟเดจเตเดฑเต† เดชเต‡เดฐเต เดฎเต†เดฎเตเดฎเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต, เดซเด‚เด—เตเดทเตป เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเดฟเดฒเต‚เดŸเต† เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚;
    • เดžเด™เตเด™เตพ เดŸเตˆเด‚เดธเตเดฑเตเดฑเดพเดฎเตเดชเต เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต.

  • เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด• เด•เตเดฐเต†เดฑเตเดฑเตเดชเตเดฐเต‹เดฌเต เดจเดฟเดจเตเดจเต เดฎเดŸเด™เตเด™เดฟเดตเดฐเตเดจเตเดจเดคเดฟเดจเต generic_make_request():
    • เดžเด™เตเด™เตพเด•เตเด•เต เดจเดฟเดฒเดตเดฟเดฒเต† เดŸเตˆเด‚เดธเตเดฑเตเดฑเดพเดฎเตเดชเต เดฒเดญเดฟเด•เตเด•เตเด‚;
    • เดžเด™เตเด™เตพ เดธเด‚เดฐเด•เตเดทเดฟเดšเตเดš เดŸเตˆเด‚เดธเตเดฑเตเดฑเดพเดฎเตเดชเดฟเดจเดพเดฏเดฟ เดจเต‹เด•เตเด•เตเด•เดฏเตเด‚ เดจเดฟเดฒเดตเดฟเดฒเต† เดธเดฎเดฏเดตเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต;
    • เดซเดฒเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดคเดฟเดจเต‡เด•เตเด•เดพเตพ เดตเดฒเตเดคเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดžเด™เตเด™เตพ เดธเด‚เดฐเด•เตเดทเดฟเดšเตเดš เดกเดฟเดธเตเด•เดฟเดจเตเดฑเต† เดชเต‡เดฐเต เด•เดฃเตเดŸเต†เดคเตเดคเดฟ เดŸเต†เตผเดฎเดฟเดจเดฒเดฟเตฝ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚.

เด•เต†เดชเตเดฐเต‹เดฌเตเดธเต ะธ เด•เตเดฐเต†เดฑเตเดฑเตเดชเตเดฐเต‹เดฌเตเดธเต เดซเตเดฒเตˆเดฏเดฟเตฝ เดซเด‚เด—เตโ€Œเดทเตป เด•เต‹เดกเต เดฎเดพเดฑเตเดฑเดพเตป เดฌเตเดฐเต‡เด•เตเด•เตโ€Œเดชเต‹เดฏเดฟเดจเตเดฑเต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเดพเดฏเดฟเด•เตเด•เดพเด‚ เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚ ะธ เด’เดฐเต เดจเดฒเตเดฒ เดˆ เดตเดฟเดทเดฏเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดฒเต‡เด–เดจเด‚. เดจเดฟเด™เตเด™เตพ เดตเดฟเดตเดฟเดง เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตเดŸเต† เด•เต‹เดกเต เดจเต‹เด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ เดฌเดฟ.เดธเดฟ.เดธเดฟ., เด…เดชเตเดชเต‹เตพ เด…เดตเดฏเตเด•เตเด•เต เดธเดฎเดพเดจเดฎเดพเดฏ เด’เดฐเต เด˜เดŸเดจเดฏเตเดฃเตเดŸเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚. เด…เดคเดฟเดจเดพเตฝ เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด†เตผเด—เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เตพ เดชเดพเดดเตโ€Œเดธเดฟเด‚เด—เต เด’เดดเดฟเดตเดพเด•เตเด•เดฟ 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 เดคเดฐเด‚ เดฎเต‚เดฒเตเดฏเดตเตเด‚ struct 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, เดจเดพเดจเต‹ เดธเต†เด•เตเด•เตปเดกเดฟเตฝ เดจเดฟเดฒเดตเดฟเดฒเต† เดŸเตˆเด‚เดธเตเดฑเตเดฑเดพเดฎเตเดชเต เดŽเดจเตเดจเดฟเดต เดฒเดญเดฟเด•เตเด•เตเด‚. เดžเด™เตเด™เตพ เด…เดคเต†เดฒเตเดฒเดพเด‚ เดชเตเดคเตเดคเดพเดฏเดฟ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเดคเดฟเตฝ เดŽเดดเตเดคเตเดจเตเดจเต struct 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.

เดˆ เด•เต‹เดกเต เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจ เดชเตˆเดคเตเดคเตบ เดธเตโ€Œเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเตฝ, เดžเด™เตเด™เตพ 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"

เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ เดฌเดฟเดชเดฟเดŽเดซเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดคเดฏเตเดฏเดพเดฑเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต เดฌเดฟเดชเดฟเดŽเดซเต เดฎเดพเด•เตเดฐเต‹ เด•เต‚เดŸเดพเดคเต† เดธเดพเดฎเตเดชเดฟเดณเตเด•เตพ เดฐเดœเดฟเดธเตเดฑเตเดฑเตผ เดšเต†เดฏเตเดฏเตเด•:

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")

เดจเดฎเตเด•เตเด•เตเด‚ เดจเดฟเดถเตเดšเดฏเดฟเด•เตเด•เต‡เดฃเตเดŸเดฟ เดตเดฐเตเด‚ struct 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 เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‰เดฏเตผเดจเตเดจ เดธเต†เดซเต เดฒเต‡เดฑเตเดฑเตปเดธเดฟ เดฎเตเดคเตฝ เด•เต‡เตผเดฃเตฝ เดชเดพเดšเตเดšเต เดตเดฐเต†
เด’เดŸเตเดตเดฟเตฝ! เดธเตเดฑเตเดฑเดพเดณเดฟเด‚เด—เต bcache เด‰เดชเด•เดฐเดฃเด‚ เดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเดคเต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เด’เดฐเต เดธเตเดฑเตเดฑเดพเดณเดฟเด‚เด—เต เด•เต‹เตพ เด†เดฃเต†เดจเตเดจเต เด‡เดชเตเดชเต‹เตพ เดจเดฎเตเดฎเตพ เด•เดพเดฃเตเดจเตเดจเต generic_make_request() เด’เดฐเต เด•เดพเดทเต† เดšเต†เดฏเตเดค เดกเดฟเดธเตเด•เดฟเดจเดพเดฏเดฟ.

เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เด•เตเดดเดฟเด•เตเด•เตเด•

เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดŸเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดธเดฎเดฏเดคเตเดคเต เดตเต‡เด—เดค เด•เตเดฑเดฏเตเด•เตเด•เตเดจเตเดจเดคเต เดŽเดจเตเดคเดพเดฃเต? เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เด•เตเด•เต—เดฃเตเดŸเดฟเด‚เด—เต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเตเดคเดจเตเดจเต† เด•เดพเดฒเดคเดพเดฎเดธเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฏเดฟ เดžเด™เตเด™เตพ เด•เดพเดฃเตเดจเตเดจเต, เด…เดคเดพเดฏเดคเต. เด…เดคเดฟเดฒเต† เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเด•เตเด•เดฃเด•เตเด•เตเด•เดณเตเดŸเต† (/proc/diskstats เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ iostat) เด•เต‚เดŸเตเดคเตฝ เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเดฟเดจเดพเดฏเตเดณเตเดณ เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเดŸเต† เด…เด•เตเด•เต—เดฃเตเดŸเดฟเด‚เด—เต เด‡เดคเตเดตเดฐเต† เด†เดฐเด‚เดญเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ. เดชเตเดฐเดถเตเดจเด‚ เดชเตเดจเตผเดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ iostat เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เด‡เดคเต เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ BCC เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดฌเดฏเต‹เดฒเต‡เดฑเตเดฑเตปเดธเดฟ, เด‡เดคเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เด•เตเด•เต—เดฃเตเดŸเดฟเด‚เด—เดฟเดจเตเดฑเต† เดคเตเดŸเด•เตเด•เดตเตเด‚ เด…เดตเดธเดพเดจเดตเตเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณเดคเดพเดฃเต. เดˆ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เดณเตŠเดจเตเดจเตเด‚ เด•เดพเดทเต† เดšเต†เดฏเตเดค เดกเดฟเดธเตเด•เดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพเด•เตเด•เต เดชเตเดฐเดถเตเดจเด™เตเด™เตพ เด•เดพเดฃเดฟเด•เตเด•เดฟเดฒเตเดฒ.

เดจเดฎเตเดฎเตพ เดซเด‚เด—เตเดทเตป เดจเต‹เด•เตเด•เดฟเดฏเดพเตฝ generic_make_request(), เด…เดญเตเดฏเตผเดคเตเดฅเดจ เด…เด•เตเด•เต—เดฃเตเดŸเดฟเด‚เด—เต เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เดฐเดฃเตเดŸเต เดซเด‚เด—เตเดทเดจเตเด•เตพ เด•เต‚เดŸเดฟ เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเดคเต เดžเด™เตเด™เตพ เด•เดพเดฃเตเด‚. เด†เดฆเตเดฏเด‚ - generic_make_request_checks(), เดกเดฟเดธเตเด•เต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดš เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเตเดŸเต† เดจเดฟเดฏเดฎเดธเดพเดงเตเดค เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเต - blk_queue_enter(), เดฐเดธเด•เดฐเดฎเดพเดฏ เด’เดฐเต เดตเต†เดฒเตเดฒเตเดตเดฟเดณเดฟเดฏเตเดฃเตเดŸเต เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด•_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_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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•