Linux ΠΈΠΌΠ° Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π² ΡΠ΄ΡΠΎΡΠΎ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°. ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΡ ΡΡΡ
ΠΈΠΌΠ°Ρ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»Π½ΠΎ Π²ΡΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Π²ΡΡΡ
Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎΡΠΎ.
ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈΠΌΠ°ΡΠ΅
ΠΠ΅ΡΠ΅ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π·Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ eBPF, ΠΈ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΠΏΠΎΠΌΠΎΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ°Π½Π΅, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°
Π¦Π΅Ρ Π΅ Π±Π°Π²Π΅Π½
ΠΠΎΠ² Ρ ΠΎΡΡ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ ΠΊΡΠΌ ΠΊΠ»ΡΡΡΠ΅ΡΠ° Ceph. Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΌΠΈΠ³ΡΠΈΡΠ°Ρ ΠΌΠ΅ ΡΠ°ΡΡ ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΊΡΠΌ Π½Π΅Π³ΠΎ, Π·Π°Π±Π΅Π»ΡΠ·Π°Ρ ΠΌΠ΅, ΡΠ΅ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅ Π·Π° Π·Π°ΠΏΠΈΡ ΠΎΡ Π½Π΅Π³ΠΎ Π±Π΅ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π½ΠΈΡΠΊΠ°, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π½Π° Π΄ΡΡΠ³ΠΈ ΡΡΡΠ²ΡΡΠΈ.
ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ, ΡΠΎΠ·ΠΈ Ρ
ΠΎΡΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° bcache ΠΈ Π½ΠΎΠ²ΠΎΡΠΎ ΡΠ΄ΡΠΎ ββΠ½Π° Linux 4.15. Π’ΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΏΡΡΠ²ΠΈΡΡ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ Ρ
ΠΎΡΡ ΠΎΡ ΡΠ°Π·ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π±Π΅ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ ΡΡΠΊ. Π Π² ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ Π±Π΅ΡΠ΅ ΡΡΠ½ΠΎ, ΡΠ΅ ΠΊΠΎΡΠ΅Π½ΡΡ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠΈΡΠΊΠΎ.
Π Π°Π·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ Π½Π° Π΄ΠΎΠΌΠ°ΠΊΠΈΠ½Π°
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ, ΠΊΠ°ΡΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π² ΠΏΡΠΎΡΠ΅ΡΠ° ceph-osd. ΠΠ° ΡΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅
ΠΠ°ΡΡΠΈΠ½Π°ΡΠ° Π½ΠΈ ΠΊΠ°Π·Π²Π°, ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° fdatasync() ΠΏΡΠ΅ΠΊΠ°ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π² ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠ° Π΄ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ generic_make_request(). Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°ΡΠ°Π²Π°, ΡΠ΅ Π½Π°ΠΉ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π΅ Π½ΡΠΊΡΠ΄Π΅ ΠΈΠ·Π²ΡΠ½ ΡΠ°ΠΌΠΈΡ osd Π΄Π΅ΠΌΠΎΠ½. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ»ΠΈ ΡΠ΄ΡΠΎΡΠΎ, ΠΈΠ»ΠΈ Π΄ΠΈΡΠΊΠΎΠ²Π΅ΡΠ΅. Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ iostat ΠΏΠΎΠΊΠ°Π·Π° Π³ΠΎΠ»ΡΠΌΠΎ Π·Π°Π±Π°Π²ΡΠ½Π΅ ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈ ΠΎΡ bcache Π΄ΠΈΡΠΊΠΎΠ²Π΅.
ΠΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Ρ ΠΎΡΡΠ° ΠΎΡΠΊΡΠΈΡ ΠΌΠ΅, ΡΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡ systemd-udevd ΠΊΠΎΠ½ΡΡΠΌΠΈΡΠ° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅ - ΠΎΠΊΠΎΠ»ΠΎ 20% Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΄ΡΠ°. Π’ΠΎΠ²Π° Π΅ ΡΡΡΠ°Π½Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ Π·Π°ΡΠΎ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Systemd-udevd ΡΠ°Π±ΠΎΡΠΈ Ρ uevents, ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ udevadm ΠΌΠΎΠ½ΠΈΡΠΎΡ. ΠΠΊΠ°Π·Π²Π° ΡΠ΅, ΡΠ΅ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΡΡΠ±ΠΈΡΠΈΡ Π·Π° ΠΏΡΠΎΠΌΡΠ½Π° ΡΠ° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½ΠΈ Π·Π° Π²ΡΡΠΊΠΎ Π±Π»ΠΎΠΊΠΎΠ²ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°. Π’ΠΎΠ²Π° Π΅ Π΄ΠΎΡΡΠ° Π½Π΅ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΡΡΠ±ΠΈΡΠΈΡ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° BCC Toolkit
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΡΠ°Π·Π±ΡΠ°Ρ
ΠΌΠ΅, ΡΠ΄ΡΠΎΡΠΎ (ΠΈ ceph Π΄Π΅ΠΌΠΎΠ½ΡΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅) ΠΏΡΠ΅ΠΊΠ°ΡΠ²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π² generic_make_request(). ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ. IN
Π’Π°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ°Π±ΠΎΡΠΈ Π±ΡΡΠ·ΠΎ. ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠ°Π²ΠΈ, Π΅ Π΄Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΠΈ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΊΡΠΌ ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° Π½Π° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ.
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():
- ΠΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π²ΠΎ ΠΊΠ»Π΅ΠΉΠΌΠΎ;
- Π’ΡΡΡΠΈΠΌ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈΡ timestamp ΠΈ Π³ΠΎ ΡΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ Ρ ΡΠ΅ΠΊΡΡΠΈΡ;
- ΠΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ Π΅ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ ΠΎΡ ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡ, Π½Π°ΠΌΠΈΡΠ°ΠΌΠ΅ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈΡ Π΄ΠΈΡΠΊ ΠΈ Π³ΠΎ ΠΏΠΎΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°.
KΠΏΡΠΎΠ±ΠΈ ΠΈ kretprobes ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΡΠΌ Π·Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΡΠ΅ΠΊΡΡΠ²Π°Π½Π΅, Π·Π° Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠΎΠ΄ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎΠΆΠ΅Ρ Π΄Π° ΡΠ΅ΡΠ΅Ρ
Π’Π΅ΠΊΡΡΡΡ Π½Π° eBPF Π² ΡΠΊΡΠΈΠΏΡΠ° Π½Π° python ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
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 ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ Π΄ΠΎΡΡΠ° ΡΡΠ΄ΠΊΠΎ ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠΎΠ²Π° ΡΠ΅ ΡΠ»ΡΡΠ²Π° ΠΏΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠ°Π½ Π½Π°ΡΠΈΠ½. Π’Π°ΠΊΠ° ΡΠ΅ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ Π΄ΠΎΡΠΈ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ΡΠΎ Π½Π° Π²Π΅ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΡΠΈΠ½ΡΠ²Π° ΡΠΊΠΎΠΊ Π² Π·Π°Π±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΠΏΡΠ΅Ρ
Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΊΡΠΌ Π΄ΠΈΡΠΊΠ°. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° udev ΡΡΠ±ΠΈΡΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ Π½ΡΠΌΠ° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π½Π° Π΄ΠΈΡΠΊΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ Π½Π΅ Π΅ ΠΌΠΎΠ½ΡΠΈΡΠ°Π½ΠΎ/ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠΎ) Π½Π΅ Π΅ Π΄ΠΎΠ±ΡΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ°. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌ Π½Π° ΡΠ΄ΡΠΎΡΠΎ Π΄Π° Π½Π΅ Π²ΡΡΡΠΈ Π½Π΅Π½ΡΠΆΠ½Π° ΡΠ°Π±ΠΎΡΠ° ΠΈ Π΄Π° Π·Π°ΠΌΡΠ°Π·ΠΈΠΌ ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° Π·Π° Π·Π°ΡΠ²ΠΊΠΈ, Π°ΠΊΠΎ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
eBPF Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π³ΡΠ²ΠΊΠ°Π² ΠΈ ΠΌΠΎΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ. Π ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ
ΠΌΠ΅ Π΅Π΄ΠΈΠ½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°Ρ
ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠ° ΡΠ°ΡΡ ΠΎΡ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ. ΠΠΊΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΠΎΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° BCC ΠΏΠΎΠΌΠΎΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΡΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΡΠ΅
ΠΠΌΠ° ΠΈ Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ°Π½Π΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° eBPF. ΠΠ΄ΠΈΠ½ ΠΎΡ ΡΡΡ
-
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com