
Π Linux ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΠΎΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΡΠ΄ΡΠΎΡΠΎ ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°. ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΡ ΡΡΡ
ΠΎΠΊΠ°Π·Π²Π°Ρ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΠΎ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π²ΡΡΡ
Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ° ΠΈ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ.
ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π³ΠΎΠ΄ΠΈΠ½ΠΈ Π±Π΅ΡΠ΅ β eBPF. Π’ΠΎΠΉ Π΄Π°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΄ΡΠΎΡΠΎ ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ Π½ΠΈΡΠΊΠΈ ΡΠ°Π·Ρ
ΠΎΠ΄ΠΈ ΠΈ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ ΠΈ Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π²ΡΠ½ΡΠ½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π² ΡΠ΄ΡΠΎΡΠΎ.
ΠΠ΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΡΡΠΈΠ»ΠΈΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ eBPF, ΠΈ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΡΠΈΠ»ΠΈΡΠ° Π·Π° ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠ°Π½Π΅, Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° . Π‘ΡΠ°ΡΠΈΡΡΠ° Π΅ ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° ΡΠ΅Π°Π»Π½ΠΈ ΡΡΠ±ΠΈΡΠΈΡ. Π©Π΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡΠ΅Π· ΠΏΡΠΎΡΠ΅ΡΠ° ΠΎΡ ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π΄ΠΎ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΠ°Π·ΡΠ΅ΡΠ°Π²Π°Π½Π΅, Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡΠ΅ ΡΡΠΈΠ»ΠΈΡΠΈ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΡΠΈΡΡΠ°ΡΠΈΠΈ.
Ceph Π΅ Π±Π°Π²Π΅Π½
Π ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Ceph Π΄ΠΎΠ±Π°Π²ΠΈΡ Π° Π½ΠΎΠ² Ρ ΠΎΡΡ. Π‘Π»Π΅Π΄ ΠΌΠΈΠ³ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΡΠ°ΡΡ ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅ Π½Π° Π½Π΅Π³ΠΎ Π·Π°Π±Π΅Π»ΡΠ·Π°Ρ ΠΌΠ΅, ΡΠ΅ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ½ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π½ΠΈΡΠΊΠ°, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΡΡΠ²ΡΡΠΈ.

Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠΈ, Π½Π° ΡΠΎΠ·ΠΈ Ρ
ΠΎΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ bcache ΠΈ Π½ΠΎΠ²ΠΎ ΡΠ΄ΡΠΎ linux 4.15. Π₯ΠΎΡΡ Ρ ΡΠ°ΠΊΠ°Π²Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΡΠΊ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ. Π Π² ΡΠΎΠ·ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ Π±Π΅ΡΠ΅ ΡΡΠ½ΠΎ, ΡΠ΅ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΅ΠΎΡΠ΅ΡΠΈΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠΈΡΠΊΠΎ.
ΠΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ Π½Π° Ρ ΠΎΡΡΠ°
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΡΠΎΠ²Π°, Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π° Π²ΡΡΡΠ΅ Π² ΠΏΡΠΎΡΠ΅ΡΠ° ceph-osd. ΠΠ° ΡΠ΅Π»ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈ (ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠ΅ ):

Π’Π°Π·ΠΈ ΠΊΠ°ΡΡΠΈΠ½Π° ΠΏΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° fdatasync() Π΅ ΠΏΡΠ΅ΠΊΠ°ΡΠ°Π»Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΏΡΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ΡΠΎ Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π² ΡΡΠ½ΠΊΡΠΈΡΡΠ° generic_make_request(). Π§ΡΠΎ Π·Π½Π°ΡΠΈ, ΡΠ΅ Π½Π°ΠΉ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π΅ Π½ΡΠΊΡΠ΄Π΅ ΠΈΠ·Π²ΡΠ½ ΡΠ°ΠΌΠΈΡ Π΄Π΅ΠΌΠΎΠ½ osd. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΈΠ»ΠΈ ΡΠ΄ΡΠΎΡΠΎ, ΠΈΠ»ΠΈ Π΄ΠΈΡΠΊΠΎΠ²Π΅ΡΠ΅. ΠΠ·Ρ
ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΠΎΡ iostat ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ
Π° Π²ΠΈΡΠΎΠΊΠ° Π»Π°ΡΠ΅Π½ΡΠ½ΠΎΡΡ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½ΠΈΡΡΠ° ΠΎΡ bcache-Π΄ΠΈΡΠΊΠΎΠ²Π΅ΡΠ΅.
ΠΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Ρ ΠΎΡΡΠ° ΠΎΡΠΊΡΠΈΡ ΠΌΠ΅, ΡΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡ systemd-udevd ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ CPU β ΠΎΠΊΠΎΠ»ΠΎ 20% Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ΄ΡΠ°. Π’ΠΎΠ²Π° Π΅ ΡΡΡΠ°Π½Π½ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΡΠ½ΠΈΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° Π½Π΅Π³ΠΎ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ Systemd-udevd ΡΠ°Π±ΠΎΡΠΈ Ρ uevent-ΠΈ, ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° Π³ΠΈ Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΠΌΠ΅ ΡΡΠ΅Π· udevadm monitor. ΠΠΊΠ°Π·Π²Π° ΡΠ΅, ΡΠ΅ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ±ΠΈΡΠΈΡ Π·Π° ΠΏΡΠΎΠΌΡΠ½Π° Π·Π° Π²ΡΡΠΊΠΎ Π±Π»ΠΎΡΠ½ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°. Π’ΠΎΠ²Π° Π΅ Π΄ΠΎΡΡΠ° Π½Π΅ΠΎΠ±ΠΈΡΠ°ΠΉΠ½ΠΎ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΡΡΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΡΡΠ±ΠΈΡΠΈΡ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° BCC Toolkit
ΠΠ°ΠΊΡΠΎ Π²Π΅ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ ΠΌΠ΅, ΡΠ΄ΡΠΎΡΠΎ (ΠΈ Π΄Π΅ΠΌΠΎΠ½ΡΡ ceph Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΠΎΠ²ΠΈΠΊ) ΠΏΡΠ΅ΠΊΠ°ΡΠ²Π° ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π² generic_make_request(). ΠΠ΅ΠΊΠ° ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ. Π ΡΠΆΠ΅ ΠΈΠΌΠ° ΡΡΠ΄Π΅ΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ β funclatency. Π©Π΅ ΡΠ»Π΅Π΄ΠΈΠΌ Π΄Π΅ΠΌΠΎΠ½ ΠΏΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΡ PID Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΡΡΠ΅ΡΠΈΡΠ΅ ΠΎΡ 1 ΡΠ΅ΠΊΡΠ½Π΄Π° ΠΈ ΡΠ΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° Π² ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ.

ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°Π±ΠΎΡΠΈ Π±ΡΡΠ·ΠΎ. ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠ°Π²ΠΈ β Π΅ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π² ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ.
Bcache Π΅ ΡΠ»ΠΎΠΆΠ΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ, ΠΊΠΎΠΉΡΠΎ Π½Π° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ° ΡΠ΅ ΡΡΡΡΠΎΠΈ ΠΎΡ ΡΡΠΈ Π΄ΠΈΡΠΊΠ°:
- backing device (ΠΊΠ΅ΡΠΈΡΠ°Ρ Π΄ΠΈΡΠΊ), Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° Π΅ Π±Π°Π²Π΅Π½ HDD;
- caching device (ΠΊΠ΅ΡΠΈΡΠ°Ρ Π΄ΠΈΡΠΊ), ΡΡΠΊ ΡΠΎΠ²Π° Π΅ Π΅Π΄ΠΈΠ½ Π΄ΡΠ» ΠΎΡ NVMe ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ;
- Π²ΠΈΡΡΡΠ°Π»Π½ΠΎΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ bcache, Ρ ΠΊΠΎΠ΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
ΠΠ½Π°Π΅ΠΌ, ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π·Π°ΡΠ²ΠΊΠ°ΡΠ° Π·Π°Π±Π°Π²Ρ, Π½ΠΎ Π·Π° ΠΊΠΎΠ΅ ΠΎΡ ΡΠ΅Π·ΠΈ ΡΡΡΡΠΎΠΉΡΡΠ²Π°? Π©Π΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠΎΠ²Π° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ.
Π‘Π΅Π³Π° Π·Π½Π°Π΅ΠΌ, ΡΠ΅ uevent-ΠΈΡΠ΅ Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠ° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠΎΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΡΡ Π½Π°ΡΠ° Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ Π½Π΅ Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π»Π΅ΡΠ½ΠΎ. ΠΠ΅ΠΊΠ° ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΠ΅ Π΅ ΡΠΎΡΡΡΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΏΠ΅ΡΠΈΠΎΠ΄ΠΈΡΠ½ΠΎ. ΠΠ΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΡΠ² ΡΠΎΡΡΡΠ΅Ρ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠΊΡΠΈΠΏΡΠ° 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 trigger Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° uevents.
ΠΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈ Π½Π° BCC
ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ ΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΅ΠΊΡΠ°Π½Π° Π½Π° Π½Π°ΠΉ-Π±Π°Π²Π½ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ generic_make_request(). ΠΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π° Π½ΠΈ ΠΈ ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ°, Π·Π° ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ.
ΠΠ»Π°Π½ΡΡ Π΅ ΠΏΡΠΎΡΡ:
- Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ kprobe Π½Π° generic_make_request():
- Π‘ΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ°, Π΄ΠΎΡΡΡΠΏΠ½ΠΎ ΡΡΠ΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°;
- Π‘ΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π²ΡΠ΅ΠΌΠ΅Π²Π°ΡΠ° ΠΌΠ°ΡΠΊΠ°.
- Π Π΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΌΠ΅ kretprobe ΠΏΡΠΈ Π²ΡΡΡΠ°Π½Π΅ ΠΎΡ generic_make_request():
- ΠΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π²ΡΠ΅ΠΌΠ΅Π²Π° ΠΌΠ°ΡΠΊΠ°;
- Π’ΡΡΡΠΈΠΌ Π·Π°ΠΏΠ°Π·Π΅Π½Π°ΡΠ° Π²ΡΠ΅ΠΌΠ΅Π²Π° ΠΌΠ°ΡΠΊΠ° ΠΈ Ρ ΡΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ Ρ ΡΠ΅ΠΊΡΡΠ°ΡΠ°;
- ΠΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ Π΅ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ ΠΎΡ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡ, Π½Π°ΠΌΠΈΡΠ°ΠΌΠ΅ Π·Π°ΠΏΠ°Π·Π΅Π½ΠΎΡΠΎ ΠΈΠΌΠ΅ Π½Π° Π΄ΠΈΡΠΊΠ° ΠΈ Π³ΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°ΠΌΠ΅ Π½Π° ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π°.
Kprobes ΠΈ kretprobes ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π½Π° ΡΠΎΡΠΊΠΈΡΠ΅ Π·Π° ΡΠΏΠΈΡΠ°Π½Π΅, Π·Π° Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΡΡ ΠΊΠΎΠ΄Π° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π² Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΈ ΡΡΠ°ΡΠΈΡ ΠΏΠΎ ΡΠ°Π·ΠΈ ΡΠ΅ΠΌΠ°. ΠΠΊΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΠΊΠΎΠ΄Π° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΡΠΈΠ»ΠΈΡΠΈ Π² , ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΠΌ, ΡΠ΅ ΡΠ΅ ΠΈΠΌΠ°Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½Π° ΡΡΡΡΠΊΡΡΡΠ°. Π’Π°ΠΊΠ° ΡΠ΅ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠ½Π΅ΠΌ ΠΏΠ°ΡΡΠΈΠ½Π³Π° Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΡΠΊΡΠΈΠΏΡΠ° ΠΈ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ Π½Π°ΠΏΡΠ°Π²ΠΎ ΠΊΡΠΌ ΡΠ°ΠΌΠ°ΡΠ° BPF ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°.
Π’Π΅ΠΊΡΡΡΡ Π½Π° eBPF Π² python-ΡΠΊΡΠΈΠΏΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
bpf_text = βββ # Π’ΡΠΊ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΊΠΎΠ΄ΡΡ Π½Π° bpf ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° βββ
ΠΠ° ΠΎΠ±ΠΌΠ΅Π½ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅, 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 ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ° Π΄ΡΡΠ³Π° ΡΠ°Π±Π»ΠΈΡΠ°, Π½Π°ΡΠ΅ΡΠ΅Π½Π° events, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΎΡΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ.
ΠΡΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΡΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Π²ΡΡΡΠ°Π½Π΅ ΠΎΡ Π½Π΅Ρ, ΠΈΠ»ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡΡΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. Π‘ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΌΠ½ΠΈΠΌ Π·Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΠΎ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅. ΠΠΌΠ°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌ Π·Π°ΠΊΡΡΠ½Π΅Π½ΠΈΠ΅ΡΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅Ρ ΠΈ Π²ΡΡΡΠ°Π½Π΅ΡΠΎ ΠΎΡ ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° Π΄ΡΡΠ³ ΠΏΡΠΎΡΠ΅Ρ, Π½ΠΎ ΡΠΎΠ²Π° Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ Π΅ Π±Π΅Π·ΠΏΠΎΠ»Π΅Π·Π½ΠΎ. ΠΠΎΠ±ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΠΊ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ , ΠΊΡΠ΄Π΅ΡΠΎ ΠΊΠ°ΡΠΎ ΠΊΠ»ΡΡ Π½Π° Ρ Π΅Ρ-ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΡΠ΅ Π·Π°Π΄Π°Π²Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π» Π½Π° struct request, ΠΊΠΎΡΡΠΎ ΠΎΡΡΠ°Π·ΡΠ²Π° Π΅Π΄Π½Π° Π·Π°ΡΠ²ΠΊΠ° ΠΊΡΠΌ Π΄ΠΈΡΠΊΠ°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΡΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ:
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);
}
Π’ΡΠΊ Π²ΡΠΎΡΠΈΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΠΌΠ΅Π½Π΅Π½ Ρ ΠΏΡΡΠ²ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π½Π° ΠΈΠ·Π²ΠΈΠΊΠ°Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ. . Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ PID Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ°, Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈΠΌ, ΠΈ ΡΠ΅ΠΊΡΡΠ° Π²ΡΠ΅ΠΌΠ΅Π²Π° ΠΎΡΠΌΠ΅ΡΠΊΠ° Π² Π½Π°Π½ΠΎΡΠ΅ΠΊΡΠ½Π΄ΠΈ. ΠΠ°ΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π² Π½ΠΎΠ²ΠΎΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΎΡΠΎ struct data_t data. ΠΠΌΠ΅ΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΎΡ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° bio, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π° ΠΏΡΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° generic_make_request(), ΠΈ Π³ΠΎ Π·Π°ΠΏΠ°Π·Π²Π°ΠΌΠ΅ Π² ΡΡΡΠ°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ° 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 Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π» Π½ΠΈΡΠΊΠ°ΡΠ°, Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ°Π±ΠΎΡΠΈΠΌ. ΠΠ·Π²ΠΈΠΊΠ²Π°Π½Π°ΡΠ° ΠΎΡ Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ Π²ΡΡΡΠ° ΠΊΠ°ΠΊΡΠΎ GID Π½Π° Π½ΠΈΡΠΊΠ°ΡΠ°, ΡΠ°ΠΊΠ° ΠΈ Π½Π΅ΠΉΠ½ΠΈΡ PID Π² Π΅Π΄Π½ΠΎ 64-Π±ΠΈΡΠΎΠ²ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΡΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π΅ Π½ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π° Π½ΠΈΡΠΊΠ°ΡΠ°, Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΡ ΠΏΡΠΎΡΠ΅Ρ. Π‘Π»Π΅Π΄ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½Π°ΡΠ° Π·Π°Π΄Π΅ΡΠΆΠΊΠ° Ρ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡ ΠΏΡΠ°Π³, ΠΏΡΠ΅Π΄Π°Π²Π°ΠΌΠ΅ Π½Π°ΡΠ°ΡΠ° ΡΡΡΡΠΊΡΡΡΠ° data Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΡΡΠ΅Π· ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° events, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·ΡΡΠΈΠ²Π°ΠΌΠ΅ Π·Π°ΠΏΠΈΡΠ° ΠΎΡ 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)
# ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·Ρ
ΠΎΠ΄Π°
start = 0
while 1:
try:
b.perf_buffer_poll()
except KeyboardInterrupt:
exit()
Π‘Π°ΠΌΠΈΡΡ ΡΠΊΡΠΈΠΏΡ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° . ΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π° ΡΠ΅ΡΡΠΎΠ²Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ fio, Π·Π°ΠΏΠΈΡΠ²Π°ΡΠ° Π½Π° bcache, ΠΈ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ udevadm monitor:

ΠΠ°ΠΉ-Π½Π°ΠΊΡΠ°Ρ! Π‘Π΅Π³Π° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠ΅ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°ΡΠ΅ ΠΊΠ°ΡΠΎ Π·Π°Π±Π°Π²ΡΡΠΎ 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 | |
ΠΠ·Π³Π»Π΅ΠΆΠ΄Π°, ΡΠ΅ ΡΠΌΠ΅ Π±Π»ΠΈΠ·ΠΎ Π΄ΠΎ ΡΠ°Π·Π³Π°Π΄Π°Π²Π°Π½Π΅ΡΠΎ. Π€ΡΠ½ΠΊΡΠΈΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π·Π° "Π·Π°ΠΌΡΠ°Π·ΡΠ²Π°Π½Π΅/ΡΠ°Π·ΠΌΡΠ°Π·ΡΠ²Π°Π½Π΅" Π½Π° ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° β ΡΠΎΠ²Π° ΡΠ° ΠΈ . Π’Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° Π½Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅, ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎ ΠΎΠΏΠ°ΡΠ½ΠΈ Π·Π° Π·Π°ΡΠ²ΠΊΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π² ΡΠ°Π·ΠΈ ΠΎΠΏΠ°ΡΠΊΠ°. ΠΡΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° blk_mq_freeze_queue() ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΠ° Π±ΡΠΎΡΡΡΡ q->mq_freeze_depth. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΄ΡΠΎΡΠΎ ΠΈΠ·ΡΠ°ΠΊΠ²Π° ΠΈΠ·ΠΏΡΠ°Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° Π² .
ΠΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΊΠ°Π½Π΅ Π·Π° ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΠΎΠΏΠ°ΡΠΊΠ° Π΅ ΡΠ°Π²Π½ΠΎ Π½Π° Π·Π°Π±Π°Π²ΡΠ½Π΅ΡΠΎ Π½Π° Π΄ΠΈΡΠΊΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΄ΡΠΎΡΠΎ ΠΈΠ·ΡΠ°ΠΊΠ²Π° Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΡΡΠ°Π²Π΅Π½ΠΈ Π² ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠΏΠ°ΡΠΊΠ°ΡΠ°, ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·Π²ΠΈΠΊΠ°Π½ , Π½Π°ΠΌΠ°Π»ΡΠ²Π°ΡΠ° Π±ΡΠΎΡΡΠ° freeze_depth.
Π‘Π΅Π³Π° Π·Π½Π°Π΅ΠΌ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ, Π·Π° Π΄Π° ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ ΡΠΈΡΡΠ°ΡΠΈΡΡΠ°. ΠΠΎΠΌΠ°Π½Π΄Π°ΡΠ° udevadm trigger Π²ΠΎΠ΄ΠΈ Π΄ΠΎ ΠΏΡΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π·Π° Π±Π»ΠΎΡΠ½ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ. Π’Π΅Π·ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π½Π° 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. ΠΠ΄ΠΈΠ½ ΠΎΡ ΡΡΡ
Π΅ , ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΌΠΎΡΠ½ΠΈ Π΅Π΄Π½ΠΎΡΠ΅Π΄ΠΎΠ²ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΈ ΠΌΠ°Π»ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ Π½Π° awk-ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π΅Π·ΠΈΠΊ. ΠΡΡΠ³ΠΈΡΡ Π΅ , ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΡΠ±ΠΈΡΠ°Π½Π΅ Π½Π° Π½ΠΈΡΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Ρ Π²ΠΈΡΠΎΠΊΠ° ΡΠ΅Π·ΠΎΠ»ΡΡΠΈΡ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΡΠ² Π²Π°ΡΠΈΡ prometheus ΡΡΡΠ²ΡΡ, Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΊΡΠ°ΡΠΈΠ²Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π΄ΠΎΡΠΈ Π°Π»Π°ΡΠΌΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
