Linux ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π°Π»Π°ΡΠΊΠΈ Π·Π° Π΄Π΅Π±Π°Π³ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅. ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΠ΄ Π½ΠΈΠ² ΠΈΠΌΠ°Π°Ρ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎ Π²Π»ΠΈΡΠ°Π½ΠΈΠ΅ Π²ΡΠ· ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ.
ΠΡΠ΅Π΄ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈΠΌΠ°ΡΠ΅
ΠΠ΅ΡΠ΅ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρ Π°Π»Π°ΡΠΊΠΈ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΠΈ ΠΊΠΎΡΠΈΡΡΠ°Ρ eBPF, Π° Π²ΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΎΠΏΡΡΠ²Π΅Π½Π° Π°Π»Π°ΡΠΊΠ° Π·Π° ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ°ΡΠ΅ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°
Π¦Π΅Ρ Π΅ Π±Π°Π²Π΅Π½
ΠΠΎΠ² Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½ Π²ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΡ Ceph. ΠΠΎ ΠΌΠΈΠ³ΡΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π²ΠΎ Π½Π΅Π³ΠΎ, Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π²ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π±ΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π±Π°ΡΠ°ΡΠ°ΡΠ° Π·Π° ΠΏΠΈΡΡΠ²Π°ΡΠ΅ ΠΎΠ΄ Π½Π΅Π³ΠΎ Π±Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠΌΠ°Π»Π° ΠΎΡΠΊΠΎΠ»ΠΊΡ Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠΈ.
ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΠ΄ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ, ΠΎΠ²ΠΎΡ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ bcache ΠΈ Π½ΠΎΠ²ΠΈΠΎΡ Linux 4.15 ΠΊΠ΅ΡΠ½Π΅Π». ΠΠ²Π° Π±Π΅ΡΠ΅ ΠΏΡΠ² ΠΏΠ°Ρ Π΄ΠΎΠΌΠ°ΡΠΈΠ½ Π½Π° ΠΎΠ²Π°Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΎΠ²Π΄Π΅. Π Π²ΠΎ ΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ Π±Π΅ΡΠ΅ ΡΠ°ΡΠ½ΠΎ Π΄Π΅ΠΊΠ° ΠΊΠΎΡΠ΅Π½ΠΎΡ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠ΅ΠΎΡΠ΅ΡΡΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΡΡΠΎ Π±ΠΈΠ»ΠΎ.
ΠΡΡΡΠ°ΠΆΡΠ²Π°ΡΠ΅ Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ
ΠΠ° ΠΏΠΎΡΠ½Π΅ΠΌΠ΅ ΡΠΎ Π³Π»Π΅Π΄Π°ΡΠ΅ Π½Π° ΠΎΠ½Π° ΡΡΠΎ ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° Π²ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ceph-osd. ΠΠ° ΠΎΠ²Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅
Π‘Π»ΠΈΠΊΠ°ΡΠ° Π½ΠΈ ΠΊΠ°ΠΆΡΠ²Π° Π΄Π΅ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° fdatasync () ΠΏΠΎΡΡΠΎΡΠΈ ΠΌΠ½ΠΎΠ³Ρ Π²ΡΠ΅ΠΌΠ΅ ΠΈΡΠΏΡΠ°ΡΠ°ΡΡΠΈ Π±Π°ΡΠ°ΡΠ΅ Π΄ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ generic_make_request(). ΠΠ²Π° Π·Π½Π°ΡΠΈ Π΄Π΅ΠΊΠ° Π½Π°ΡΠ²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π΅ Π½Π΅ΠΊΠ°Π΄Π΅ Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΡΠ°ΠΌΠΈΠΎΡ osd daemon. ΠΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ»ΠΈ ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ ΠΈΠ»ΠΈ Π΄ΠΈΡΠΊΠΎΠ²ΠΈΡΠ΅. ΠΠ·Π»Π΅Π·ΠΎΡ Π½Π° iostat ΠΏΠΎΠΊΠ°ΠΆΠ° Π²ΠΈΡΠΎΠΊΠ° Π»Π°ΡΠ΅Π½ΡΠ½ΠΎΡΡ Π²ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π±Π°ΡΠ°ΡΠ°ΡΠ° ΠΎΠ΄ Π΄ΠΈΡΠΊΠΎΠ²ΠΈΡΠ΅ Π·Π° bcache.
ΠΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π΄ΠΎΠΌΠ°ΡΠΈΠ½ΠΎΡ, ΠΎΡΠΊΡΠΈΠ²ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΄Π΅ΠΌΠΎΠ½ΠΎΡ systemd-udevd ΡΡΠΎΡΠΈ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΊΠΎΠ»ΠΈΡΠΈΠ½Π° Π½Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΎΡ - ΠΎΠΊΠΎΠ»Ρ 20% Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ°Π΄ΡΠ°. ΠΠ²Π° Π΅ ΡΡΠ΄Π½ΠΎ ΠΎΠ΄Π½Π΅ΡΡΠ²Π°ΡΠ΅, ΠΏΠ° ΡΡΠ΅Π±Π° Π΄Π° ΠΎΡΠΊΡΠΈΠ΅ΡΠ΅ Π·ΠΎΡΡΠΎ. ΠΠΈΠ΄Π΅ΡΡΠΈ Systemd-udevd ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ uevents, ΡΠ΅ΡΠΈΠ²ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π²ΠΎ ΡΠ΅Π»ΠΎΡΡ udevadm ΠΌΠΎΠ½ΠΈΡΠΎΡ. ΠΠ·Π»Π΅Π³ΡΠ²Π° Π΄Π΅ΠΊΠ° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ Π½Π°ΡΡΠ°Π½ΠΈ Π·Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π·Π° ΡΠ΅ΠΊΠΎΡ Π±Π»ΠΎΠΊ ΡΡΠ΅Π΄ Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΡ. ΠΠ²Π° Π΅ ΡΠΎΡΠ΅ΠΌΠ° Π½Π΅Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ, ΠΏΠ° ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΡΡΠΎ Π³ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠΈΡΠ΅ ΠΎΠ²ΠΈΠ΅ Π½Π°ΡΡΠ°Π½ΠΈ.
ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΏΡΠΈΠ±ΠΎΡΠΎΡ ΡΠΎ Π°Π»Π°ΡΠΊΠΈ Π·Π° BCC
ΠΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅ΡΠ΅ Π΄ΠΎΠ·Π½Π°Π²ΠΌΠ΅, ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ (ΠΈ ΡΠ΅Ρ Π΄Π΅ΠΌΠΎΠ½ΠΎΡ Π²ΠΎ ΡΠΈΡΡΠ΅ΠΌΡΠΊΠΈΠΎΡ ΠΏΠΎΠ²ΠΈΠΊ) ΠΏΠΎΠΌΠΈΠ½ΡΠ²Π° ΠΌΠ½ΠΎΠ³Ρ Π²ΡΠ΅ΠΌΠ΅ Π²ΠΎ generic_make_request(). ΠΡΠ΄Π΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° ΡΠ° ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌΠ΅ Π±ΡΠ·ΠΈΠ½Π°ΡΠ° Π½Π° ΠΎΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΡΠ°. ΠΠ
ΠΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΡΠ° ΠΎΠ±ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠΈ Π±ΡΠ·ΠΎ. Π‘Γ¨ ΡΡΠΎ ΠΏΡΠ°Π²ΠΈ Π΅ Π΄Π° Π³ΠΎ ΠΏΡΠ΅Π½Π΅ΡΠ΅ Π±Π°ΡΠ°ΡΠ΅ΡΠΎ Π΄ΠΎ ΡΠ΅Π΄ΠΎΡ Π·Π° Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΡΠ΅Π΄ΠΎΡ.
Bcache Π΅ ΡΠ»ΠΎΠΆΠ΅Π½ ΡΡΠ΅Π΄ ΠΊΠΎΡ Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΠΎΠ΄ ΡΡΠΈ Π΄ΠΈΡΠΊΠΎΠ²ΠΈ:
- ΡΡΠ΅Π΄ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΊΠ° (ΠΊΠ΅ΡΠΈΡΠ°Π½ Π΄ΠΈΡΠΊ), Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ ΡΠΎΠ° Π΅ Π±Π°Π²Π΅Π½ HDD;
- ΡΡΠ΅Π΄ Π·Π° ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅ (Π΄ΠΈΡΠΊ Π·Π° ΠΊΠ΅ΡΠΈΡΠ°ΡΠ΅), ΠΎΠ²Π΄Π΅ ΠΎΠ²Π° Π΅ Π΅Π΄Π½Π° ΠΏΠ°ΡΡΠΈΡΠΈΡΠ° Π½Π° ΡΡΠ΅Π΄ΠΎΡ NVMe;
- bcache Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈΠΎΡ ΡΡΠ΅Π΄ ΡΠΎ ΠΊΠΎΡ ΡΠ°Π±ΠΎΡΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ°.
ΠΠ½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΡΠ΅Π½ΠΎΡΠΎΡ Π½Π° Π±Π°ΡΠ°ΡΠ°ΡΠ° Π΅ Π±Π°Π²Π΅Π½, Π½ΠΎ Π·Π° ΠΊΠΎΡ ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΡΡΠ΅Π΄ΠΈ? ΠΠ΅ ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΡΠΎ ΠΎΠ²Π° ΠΌΠ°Π»ΠΊΡ ΠΏΠΎΠ΄ΠΎΡΠ½Π°.
Π‘Π΅Π³Π° Π·Π½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π½Π°ΡΡΠ°Π½ΠΈΡΠ΅ Π²Π΅ΡΠΎΡΠ°ΡΠ½ΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠ΅ Π΅ ΡΠΎΠ»ΠΊΡ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ ΡΡΠΎ ΡΠΎΡΠ½ΠΎ ΡΠ° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΡΠ²Π° Π½ΠΈΠ²Π½Π°ΡΠ° Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡΠ°. ΠΠ° ΠΏΡΠ΅ΡΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΎΠ²Π° Π΅ Π½Π΅ΠΊΠΎΡ Π²ΠΈΠ΄ ΡΠΎΡΡΠ²Π΅Ρ ΠΊΠΎΡ ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ ΡΠ΅ ΡΡΠ°ΡΡΡΠ²Π°. ΠΡΠ΄Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎΠ² ΡΠΎΡΡΠ²Π΅Ρ ΡΠ°Π±ΠΎΡΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΎΡ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠΊΡΠΈΠΏΡΠ° execsnoop ΠΎΠ΄ ΠΈΡΡΠΈΠΎΡ
ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ Π²Π°ΠΊΠ°:
/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 Π±Π΅ΡΠ΅ ΡΠΎΠ»ΠΊΡ Π±Π°Π²Π΅Π½. ΠΠΎΠ΄Π³ΠΎΡΠ²ΠΈΠ²ΠΌΠ΅ ΡΠ΅ΡΡ-ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° ΠΈ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠ΅ΠΏΡΠΎΠ΄ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΡ ΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° fio Π½Π° bcache, ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ΡΠΎ udevadm Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ uevents.
ΠΠΈΡΡΠ²Π°ΡΠ΅ Π°Π»Π°ΡΠΊΠΈ Π·Π°ΡΠ½ΠΎΠ²Π°Π½ΠΈ Π½Π° BCC
ΠΡΠ΄Π΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π° Π°Π»Π°ΡΠΊΠ° Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ ΠΈ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π°ΡΠ΅ Π½Π° Π½Π°ΡΠ±Π°Π²Π½ΠΈΡΠ΅ ΠΏΠΎΠ²ΠΈΡΠΈ generic_make_request(). ΠΓ¨ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ° ΠΈ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠΎΡ Π·Π° ΠΊΠΎΡ Π±Π΅ΡΠ΅ ΠΏΠΎΠ²ΠΈΠΊΠ°Π½Π° ΠΎΠ²Π°Π° ΡΡΠ½ΠΊΡΠΈΡΠ°.
ΠΠ»Π°Π½ΠΎΡ Π΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½:
- Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΡΠ΅ ΡΠ΅ kprobe Π½Π° generic_make_request():
- ΠΠΎ Π·Π°ΡΡΠ²ΡΠ²Π°ΠΌΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠΎΡ Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°, Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΎ ΠΏΡΠ΅ΠΊΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ°;
- ΠΠΎ Π·Π°ΡΡΠ²ΡΠ²Π°ΠΌΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠΈΠΎΡ ΠΏΠ΅ΡΠ°Ρ.
- Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΡΠ΅ ΡΠ΅ kretprobe Π·Π° Π²ΡΠ°ΡΠ°ΡΠ΅ ΠΎΠ΄ generic_make_request():
- ΠΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠΈ ΠΏΠ΅ΡΠ°Ρ;
- ΠΠΎ Π±Π°ΡΠ°ΠΌΠ΅ Π·Π°ΡΡΠ²Π°Π½ΠΈΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΡΠΊΠΈ ΠΏΠ΅ΡΠ°Ρ ΠΈ Π³ΠΎ ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠΎ ΡΠ΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ;
- ΠΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΎΡ Π΅ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌ ΠΎΠ΄ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ, ΡΠΎΠ³Π°Ρ Π³ΠΎ Π½Π°ΠΎΡΠ°ΠΌΠ΅ Π·Π°ΡΡΠ²Π°Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ Π½Π° Π΄ΠΈΡΠΊΠΎΡ ΠΈ Π³ΠΎ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π°ΠΌΠ΅ Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΠΎΡ.
ΠΡΠΎΠ½Π΄ΠΈ ΠΈ kretprobes ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΡΠ΅ΠΊΠΈΠ½ Π·Π° Π΄Π° Π³ΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠ΄ΠΎΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° Π²ΠΎ Π»Π΅Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠΈΡΠ°ΡΠ΅
Π’Π΅ΠΊΡΡΠΎΡ 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 ΠΈ Π²ΡΠ΅Π΄Π½ΠΎΡΡ Π½Π° ΡΠΈΠΏΠΎΡ 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():
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")
ΠΠ΅ ΡΡΠ΅Π±Π° ΠΈ Π½ΠΈΠ΅ Π΄Π° ΡΡΠ²ΡΠ΄ΠΈΠΌΠ΅ 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()
Π‘Π°ΠΌΠ°ΡΠ° ΡΠΊΡΠΈΠΏΡΠ° Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ½Π° Π½Π°
ΠΠΎΠ½Π΅ΡΠ½ΠΎ! Π‘Π΅Π³Π° Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΎΠ½Π° ΡΡΠΎ ΠΈΠ·Π³Π»Π΅Π΄Π°ΡΠ΅ ΠΊΠ°ΠΊΠΎ Π·Π°ΡΡΠΎΡ Π²ΠΎ 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 ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΡΠ²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π°Ρ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π·Π° Π±Π»ΠΎΠΊ-ΡΡΠ΅Π΄ΠΎΡ. ΠΠ²ΠΈΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π²ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π½Π° 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 ΠΊΠΎΠ³Π° Π½Π΅ΠΌΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π΄ΠΈΡΠΊΠΎΡ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ΅Π΄ΠΎΡ Π½Π΅ Π΅ ΠΌΠΎΠ½ΡΠΈΡΠ°Π½/ΠΈΡΠΊΠ»ΡΡΠ΅Π½) Π½Π΅ Π΅ Π΄ΠΎΠ±ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°. Π‘Π΅ΠΏΠ°ΠΊ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΌΡ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌΠ΅ Π½Π° ΠΊΠ΅ΡΠ½Π΅Π»ΠΎΡ Π΄Π° Π½Π΅ ΠΏΡΠ°Π²ΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π±Π½Π° ΡΠ°Π±ΠΎΡΠ° ΠΈ Π΄Π° Π³ΠΎ Π·Π°ΠΌΡΠ·Π½Π΅ ΡΠ΅Π΄ΠΎΡ Π·Π° Π±Π°ΡΠ°ΡΠ΅ Π°ΠΊΠΎ ΡΠΎΠ° Π½Π΅ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ.
ΠΠ°ΠΊΠ»ΡΡΠΎΠΊ
eBPF Π΅ ΠΌΠ½ΠΎΠ³Ρ ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½Π° ΠΈ ΠΌΠΎΡΠ½Π° Π°Π»Π°ΡΠΊΠ°. ΠΠΎ Π½Π°ΠΏΠΈΡΠΎΡ ΡΠ°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ Π΅Π΄Π΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅Π½ ΡΠ»ΡΡΠ°Ρ ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°Π²ΠΌΠ΅ ΠΌΠ°Π» Π΄Π΅Π» ΠΎΠ΄ ΡΠΎΠ° ΡΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ. ΠΠΊΠΎ ΡΡΠ΅ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½ΠΈ Π·Π° ΡΠ°Π·Π²ΠΎΡ Π½Π° BCC ΠΊΠΎΠΌΡΠ½Π°Π»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ, Π²ΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅
ΠΠΎΡΡΠΎΡΠ°Ρ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ Π°Π»Π°ΡΠΊΠΈ Π·Π° Π΄Π΅Π±Π°Π³ΠΈΡΠ°ΡΠ΅ ΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ°ΡΠ΅ Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° eBPF. ΠΠ΄Π΅Π½ ΠΎΠ΄ Π½ΠΈΠ² -
ΠΠ·Π²ΠΎΡ: www.habr.com