Од висока латСнтност Π½Π° Ceph Π΄ΠΎ Π·Π°ΠΊΡ€ΠΏΠ° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ eBPF/BCC

Од висока латСнтност Π½Π° Ceph Π΄ΠΎ Π·Π°ΠΊΡ€ΠΏΠ° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ eBPF/BCC

Linux ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ Π°Π»Π°Ρ‚ΠΊΠΈ Π·Π° Π΄Π΅Π±Π°Π³ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈΡ‚Π΅. ΠŸΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ ΠΎΠ΄ Π½ΠΈΠ² ΠΈΠΌΠ°Π°Ρ‚ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ влијаниС Π²Ρ€Π· пСрформанситС Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° сС користат Π²ΠΎ производството.

ΠŸΡ€Π΅Π΄ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π³ΠΎΠ΄ΠΈΠ½ΠΈ имашС Ρ€Π°Π·Π²ΠΈΠ΅Π½Π° Π΅ Π΄Ρ€ΡƒΠ³Π° Π°Π»Π°Ρ‚ΠΊΠ° - eBPF. ΠžΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° слСдСњС Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈ корисничкитС Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ со ниски Ρ‚Ρ€ΠΎΡˆΠΎΡ†ΠΈ ΠΈ Π±Π΅Π· ΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π΄Π° сС ΠΎΠ±Π½ΠΎΠ²ΡƒΠ²Π°Π°Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΈ Π΄Π° сС Π²Ρ‡ΠΈΡ‚ΡƒΠ²Π°Π°Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΎΠ΄ Ρ‚Ρ€Π΅Ρ‚ΠΈ страни Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚.

Π’Π΅ΡœΠ΅ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³Ρƒ Π°Π»Π°Ρ‚ΠΊΠΈ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠΈ користат eBPF, Π° Π²ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ќС ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ сопствСна Π°Π»Π°Ρ‚ΠΊΠ° Π·Π° ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€Π°ΡšΠ΅ Π²Ρ€Π· основа Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° PythonBCC. Π‘Ρ‚Π°Ρ‚ΠΈΡ˜Π°Ρ‚Π° Π΅ заснована Π½Π° вистински настани. ЌС ΠΎΠ΄ΠΈΠΌΠ΅ ΠΎΠ΄ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π΄ΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΠΊΠ° Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ постоСчкитС ΠΊΠΎΠΌΡƒΠ½Π°Π»Π½ΠΈ услуги ΠΌΠΎΠΆΠ΅ Π΄Π° сС користат Π²ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ ситуации.

Π¦Π΅Ρ„ Π΅ Π±Π°Π²Π΅Π½

Нов домаќин Π΅ Π΄ΠΎΠ΄Π°Π΄Π΅Π½ Π²ΠΎ кластСрот Ceph. По ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π½Π΅ΠΊΠΎΠΈ ΠΎΠ΄ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π²ΠΎ Π½Π΅Π³ΠΎ, Π·Π°Π±Π΅Π»Π΅ΠΆΠ°Π²ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π±Π°Ρ€Π°ΡšΠ°Ρ‚Π° Π·Π° ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ ΠΎΠ΄ Π½Π΅Π³ΠΎ бСшС ΠΌΠ½ΠΎΠ³Ρƒ ΠΏΠΎΠΌΠ°Π»Π° ΠΎΡ‚ΠΊΠΎΠ»ΠΊΡƒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ сСрвСри.

Од висока латСнтност Π½Π° Ceph Π΄ΠΎ Π·Π°ΠΊΡ€ΠΏΠ° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ eBPF/BCC
Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΈ, овој домаќин ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡˆΠ΅ bcache ΠΈ Π½ΠΎΠ²ΠΈΠΎΡ‚ Linux 4.15 ΠΊΠ΅Ρ€Π½Π΅Π». Ова бСшС ΠΏΡ€Π² ΠΏΠ°Ρ‚ домаќин Π½Π° ΠΎΠ²Π°Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° Π΄Π° сС користи ΠΎΠ²Π΄Π΅. И Π²ΠΎ Ρ‚ΠΎΡ˜ ΠΌΠΎΠΌΠ΅Π½Ρ‚ бСшС јасно Π΄Π΅ΠΊΠ° ΠΊΠΎΡ€Π΅Π½ΠΎΡ‚ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ тСорСтски ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΡˆΡ‚ΠΎ Π±ΠΈΠ»ΠΎ.

Π˜ΡΡ‚Ρ€Π°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚

Π”Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ со глСдањС Π½Π° ΠΎΠ½Π° ΡˆΡ‚ΠΎ сС случува Π²ΠΎ процСсот Π½Π° ceph-osd. Π—Π° ΠΎΠ²Π° ќС користимС ΠΏΠ΅Ρ€Ρ„ ΠΈ пламСнскоп (повСќС Π·Π° ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ Ρ‚ΡƒΠΊΠ°):

Од висока латСнтност Π½Π° Ceph Π΄ΠΎ Π·Π°ΠΊΡ€ΠΏΠ° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ eBPF/BCC
Π‘Π»ΠΈΠΊΠ°Ρ‚Π° Π½ΠΈ ΠΊΠ°ΠΆΡƒΠ²Π° Π΄Π΅ΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° fdatasync () ΠΏΠΎΡ‚Ρ€ΠΎΡˆΠΈ ΠΌΠ½ΠΎΠ³Ρƒ Π²Ρ€Π΅ΠΌΠ΅ ΠΈΡΠΏΡ€Π°ΡœΠ°Ρ˜ΡœΠΈ Π±Π°Ρ€Π°ΡšΠ΅ Π΄ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ generic_make_request(). Ова Π·Π½Π°Ρ‡ΠΈ Π΄Π΅ΠΊΠ° Π½Π°Ρ˜Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ Π΅ Π½Π΅ΠΊΠ°Π΄Π΅ Π½Π°Π΄Π²ΠΎΡ€ ΠΎΠ΄ самиот osd daemon. Ова ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ»ΠΈ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΈΠ»ΠΈ дисковитС. Π˜Π·Π»Π΅Π·ΠΎΡ‚ Π½Π° iostat ΠΏΠΎΠΊΠ°ΠΆΠ° висока латСнтност Π²ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° Π±Π°Ρ€Π°ΡšΠ°Ρ‚Π° ΠΎΠ΄ дисковитС Π·Π° bcache.

ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π΄ΠΎΠΌΠ°ΡœΠΈΠ½ΠΎΡ‚, ΠΎΡ‚ΠΊΡ€ΠΈΠ²ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΄Π΅ΠΌΠΎΠ½ΠΎΡ‚ systemd-udevd Ρ‚Ρ€ΠΎΡˆΠΈ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½Π° Π½Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° процСсорот - ΠΎΠΊΠΎΠ»Ρƒ 20% Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Ρ˜Π°Π΄Ρ€Π°. Ова Π΅ Ρ‡ΡƒΠ΄Π½ΠΎ ΠΎΠ΄Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅, ΠΏΠ° Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅Ρ‚Π΅ Π·ΠΎΡˆΡ‚ΠΎ. Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Systemd-udevd Ρ€Π°Π±ΠΎΡ‚ΠΈ со uevents, Ρ€Π΅ΡˆΠΈΠ²ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π²ΠΎ цСлост udevadm ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€. Π˜Π·Π»Π΅Π³ΡƒΠ²Π° Π΄Π΅ΠΊΠ° сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ Π³ΠΎΠ»Π΅ΠΌ Π±Ρ€ΠΎΡ˜ настани Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π·Π° сСкој Π±Π»ΠΎΠΊ ΡƒΡ€Π΅Π΄ Π²ΠΎ систСмот. Ова Π΅ сосСма Π½Π΅Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΎ, ΠΏΠ° ќС Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ ΡˆΡ‚ΠΎ Π³ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ситС ΠΎΠ²ΠΈΠ΅ настани.

ΠšΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΡ€ΠΈΠ±ΠΎΡ€ΠΎΡ‚ со Π°Π»Π°Ρ‚ΠΊΠΈ Π·Π° BCC

Како ΡˆΡ‚ΠΎ вСќС Π΄ΠΎΠ·Π½Π°Π²ΠΌΠ΅, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ (ΠΈ Ρ†Π΅Ρ„ Π΄Π΅ΠΌΠΎΠ½ΠΎΡ‚ Π²ΠΎ систСмскиот ΠΏΠΎΠ²ΠΈΠΊ) ΠΏΠΎΠΌΠΈΠ½ΡƒΠ²Π° ΠΌΠ½ΠΎΠ³Ρƒ Π²Ρ€Π΅ΠΌΠ΅ Π²ΠΎ generic_make_request(). АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° ја ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΠ΅ Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π° Π½Π° ΠΎΠ²Π°Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°. Π’Πž Π‘ΠšΠš Π’Π΅ΡœΠ΅ постои прСкрасна Π°Π»Π°Ρ‚ΠΊΠ° - функционалност. ЌС Π³ΠΎ слСдимС Π΄Π΅ΠΌΠΎΠ½ΠΎΡ‚ спорСд Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ‚ PID со ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π» ΠΎΠ΄ 1 сСкунда ΠΏΠΎΠΌΠ΅Ρ“Ρƒ ΠΈΠ·Π»Π΅Π·ΠΈΡ‚Π΅ ΠΈ ќС Π³ΠΎ изнСсСмС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚ Π²ΠΎ милисСкунди.

Од висока латСнтност Π½Π° Ceph Π΄ΠΎ Π·Π°ΠΊΡ€ΠΏΠ° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ 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 бСшС Ρ‚ΠΎΠ»ΠΊΡƒ Π±Π°Π²Π΅Π½. ΠŸΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΠ²ΠΌΠ΅ тСст-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° со ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π° ΠΈ сС ΠΎΠ±ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ Π΄Π° Π³ΠΎ Ρ€Π΅ΠΏΡ€ΠΎΠ΄ΡƒΡ†ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ со ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° fio Π½Π° bcache, ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎ Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°ΡšΠ΅ Π½Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ udevadm Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ uevents.

ΠŸΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π°Π»Π°Ρ‚ΠΊΠΈ засновани Π½Π° BCC

АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° напишСмС Сдноставна Π°Π»Π°Ρ‚ΠΊΠ° Π·Π° слСдСњС ΠΈ ΠΏΡ€ΠΈΠΊΠ°ΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° Π½Π°Ρ˜Π±Π°Π²Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ²ΠΈΡ†ΠΈ generic_make_request(). Нè интСрСсира ΠΈ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° дискот Π·Π° кој бСшС ΠΏΠΎΠ²ΠΈΠΊΠ°Π½Π° ΠΎΠ²Π°Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°.

ΠŸΠ»Π°Π½ΠΎΡ‚ Π΅ СдноставСн:

  • Π Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ сС kprobe Π½Π° generic_make_request():
    • Π“ΠΎ Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°ΠΌΠ΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° дискот Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°, достапно ΠΏΡ€Π΅ΠΊΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΡ‚ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π°;
    • Π“ΠΎ Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°ΠΌΠ΅ врСмСнскиот ΠΏΠ΅Ρ‡Π°Ρ‚.

  • Π Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€Π°Ρ˜Ρ‚Π΅ сС kretprobe Π·Π° Π²Ρ€Π°ΡœΠ°ΡšΠ΅ ΠΎΠ΄ generic_make_request():
    • Π“ΠΎ Π΄ΠΎΠ±ΠΈΠ²Π°ΠΌΠ΅ Ρ‚Π΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ‚ врСмСнски ΠΏΠ΅Ρ‡Π°Ρ‚;
    • Π“ΠΎ Π±Π°Ρ€Π°ΠΌΠ΅ Π·Π°Ρ‡ΡƒΠ²Π°Π½ΠΈΠΎΡ‚ врСмСнски ΠΏΠ΅Ρ‡Π°Ρ‚ ΠΈ Π³ΠΎ спорСдувамС со Ρ‚Π΅ΠΊΠΎΠ²Π½ΠΈΠΎΡ‚;
    • Ако Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΎΡ‚ Π΅ ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌ ΠΎΠ΄ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΎΡ‚, Ρ‚ΠΎΠ³Π°Ρˆ Π³ΠΎ Π½Π°ΠΎΡ“Π°ΠΌΠ΅ Π·Π°Ρ‡ΡƒΠ²Π°Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅ Π½Π° дискот ΠΈ Π³ΠΎ ΠΏΡ€ΠΈΠΊΠ°ΠΆΡƒΠ²Π°ΠΌΠ΅ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΡ‚.

Ксонди ΠΈ kretprobes користСтС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° ΠΏΡ€Π΅ΠΊΠΈΠ½ Π·Π° Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ Π»Π΅Ρ‚. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ‡ΠΈΡ‚Π°Ρ‚Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π° ΠΈ Π΄ΠΎΠ±Ρ€ΠΎ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π½Π° ΠΎΠ²Π°Π° Ρ‚Π΅ΠΌΠ°. Ако Π³ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠΌΡƒΠ½Π°Π»Π½ΠΈ услуги Π²ΠΎ Π‘ΠšΠš, Ρ‚ΠΎΠ³Π°Ρˆ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ°Π°Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Π° структура. Π’Π°ΠΊΠ°, Π²ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ќС Π³ΠΎ прСскокнСмС ΠΏΠ°Ρ€ΡΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π½Π° скриптата ΠΈ ќС ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌΠ΅ Π½Π° самата ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° BPF.

ВСкстот eBPF Π²ΠΎ скриптата Π·Π° ΠΏΠΈΡ‚ΠΎΠ½ ΠΈΠ·Π³Π»Π΅Π΄Π° Π²Π°ΠΊΠ°:

bpf_text = β€œβ€β€ # Here will be the bpf program code β€œβ€β€

Π—Π° Ρ€Π°Π·ΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ‚Π΅ eBPF користат Ρ…Π°Ρˆ Ρ‚Π°Π±Π΅Π»ΠΈ. НиС ќС Π³ΠΎ сторимС истото. ЌС Π³ΠΎ користимС процСсот PID ΠΊΠ°ΠΊΠΎ ΠΊΠ»ΡƒΡ‡, Π° структурата ќС ја Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ врСдност:

struct data_t {
	u64 pid;
	u64 ts;
	char comm[TASK_COMM_LEN];
	u64 lat;
	char disk[DISK_NAME_LEN];
};

BPF_HASH(p, u64, struct data_t);
BPF_PERF_OUTPUT(events);

ОвдС рСгистрирамС Ρ…Π΅Ρˆ Ρ‚Π°Π±Π΅Π»Π° Π½Π°Ρ€Π΅Ρ‡Π΅Π½Π° p, со Ρ‚ΠΈΠΏ Π½Π° ΠΊΠ»ΡƒΡ‡ u64 ΠΈ врСдност Π½Π° Ρ‚ΠΈΠΏΠΎΡ‚ struct data_t. Π’Π°Π±Π΅Π»Π°Ρ‚Π° ќС Π±ΠΈΠ΄Π΅ достапна Π²ΠΎ контСкст Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° BPF. ΠœΠ°ΠΊΡ€ΠΎΡ‚ΠΎ BPF_PERF_OUTPUT рСгистрира Π΄Ρ€ΡƒΠ³Π° Π½Π°Ρ€Π΅Ρ‡Π΅Π½Π° Ρ‚Π°Π±Π΅Π»Π° настани, кој сС користи Π·Π° прСнос Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ корисничкиот простор.

ΠŸΡ€ΠΈ ΠΌΠ΅Ρ€Π΅ΡšΠ΅ Π½Π° Π΄ΠΎΡ†Π½Π΅ΡšΠ°Ρ‚Π° ΠΏΠΎΠΌΠ΅Ρ“Ρƒ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΈ Π²Ρ€Π°ΡœΠ°ΡšΠ΅ ΠΎΠ΄ Π½Π΅Π°, ΠΈΠ»ΠΈ ΠΏΠΎΠΌΠ΅Ρ“Ρƒ ΠΏΠΎΠ²ΠΈΡ†ΠΈ Π΄ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π·Π΅ΠΌΠ΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΌΠΎΡ€Π° Π΄Π° ΠΏΡ€ΠΈΠΏΠ°Ρ“Π°Π°Ρ‚ Π½Π° истиот контСкст. Π‘ΠΎ Π΄Ρ€ΡƒΠ³ΠΈ Π·Π±ΠΎΡ€ΠΎΠ²ΠΈ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Π·Π° ΠΌΠΎΠΆΠ½ΠΎΡ‚ΠΎ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅. ИмамС моТност Π΄Π° ја ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΠ΅ Π΄ΠΎΡ†Π½Π΅ΡšΠ΅Ρ‚ΠΎ ΠΏΠΎΠΌΠ΅Ρ“Ρƒ ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π²ΠΎ контСкст Π½Π° Π΅Π΄Π΅Π½ процСс ΠΈ Π²Ρ€Π°ΡœΠ°ΡšΠ΅Ρ‚ΠΎ ΠΎΠ΄ Ρ‚Π°Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° Π²ΠΎ контСкст Π½Π° Π΄Ρ€ΡƒΠ³ процСс, Π½ΠΎ ΠΎΠ²Π° Π΅ Π²Π΅Ρ€ΠΎΡ˜Π°Ρ‚Π½ΠΎ бСскорисно. Π”ΠΎΠ±Π°Ρ€ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΠ²Π΄Π΅ Π±ΠΈ Π±ΠΈΠ» Π±ΠΈΠΎΠ»Π°Ρ‚Π΅Π½Ρ†ΠΈΡ˜Π° ΠΊΠΎΠΌΡƒΠ½Π°Π»Π½ΠΈ услуги, ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ ΠΊΠΎΠΏΡ‡Π΅Ρ‚ΠΎ Π·Π° Ρ…Π°Ρˆ Ρ‚Π°Π±Π΅Π»Π° Π΅ поставСно Π½Π° ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π°Ρ‡ ΠΊΠΎΠ½ struct Π±Π°Ρ€Π°ΡšΠ΅, ΡˆΡ‚ΠΎ ΠΎΠ΄Ρ€Π°Π·ΡƒΠ²Π° Π΅Π΄Π½ΠΎ Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° диск.

Π‘Π»Π΅Π΄Π½ΠΎ, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ напишСмС ΠΊΠΎΠ΄ΠΎΡ‚ ΡˆΡ‚ΠΎ ќС Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠΎΠ³Π° ќС сС ΠΏΠΎΠ²ΠΈΠΊΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° ΡˆΡ‚ΠΎ сС ΠΏΡ€ΠΎΡƒΡ‡ΡƒΠ²Π°:

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.

Π’ΠΎ скриптата Π·Π° 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 ΠΏΡ€Π΅ΠΊΡƒ 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()

Π‘Π°ΠΌΠ°Ρ‚Π° скрипта Π΅ достапна Π½Π° GItHub. АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈΠΌΠ΅ Π½Π° тСст-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ fio, ΠΏΠΈΡˆΡƒΠ²Π° Π²ΠΎ bcache ΠΈ повикај Π³ΠΎ udevadm ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€:

Од висока латСнтност Π½Π° Ceph Π΄ΠΎ Π·Π°ΠΊΡ€ΠΏΠ° Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ eBPF/BCC
ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ! Π‘Π΅Π³Π° Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΎΠ½Π° ΡˆΡ‚ΠΎ изглСдашС ΠΊΠ°ΠΊΠΎ Π·Π°ΡΡ‚ΠΎΡ˜ Π²ΠΎ bcache ΡƒΡ€Π΅Π΄ Π΅ Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚ Π·Π°ΡΡ‚ΠΎΡ˜ Π²ΠΎ ΠΏΠΎΠ²ΠΈΠΊ generic_make_request() Π·Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ диск.

ΠšΠΎΠΏΠ°Ρ˜Ρ‚Π΅ Π²ΠΎ ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚

Π¨Ρ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Π΅ Π·Π°Π±Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° прСносот Π½Π° Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ? Π“Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° Π΄ΠΎΡ†Π½Π΅ΡšΠ΅Ρ‚ΠΎ сС случува ΡƒΡˆΡ‚Π΅ ΠΏΡ€Π΅Π΄ ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π½Π° смСтководството Π½Π° Π±Π°Ρ€Π°ΡšΠ°Ρ‚Π°, Ρ‚.Π΅. смСтководството Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π±Π°Ρ€Π°ΡšΠ΅ Π·Π° ΠΏΠΎΠ½Π°Ρ‚Π°ΠΌΠΎΡˆΠ½ΠΎ ΠΈΠ·Π»Π΅Π³ΡƒΠ²Π°ΡšΠ΅ Π½Π° статистика Π·Π° Π½Π΅Π³ΠΎ (/proc/diskstats ΠΈΠ»ΠΈ iostat) сè ΡƒΡˆΡ‚Π΅ Π½Π΅ Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π°Ρ‚ΠΎ. Ова ΠΌΠΎΠΆΠ΅ лСсно Π΄Π° сС ΠΏΠΎΡ‚Π²Ρ€Π΄ΠΈ со Π²ΠΊΠ»ΡƒΡ‡ΡƒΠ²Π°ΡšΠ΅ Π½Π° iostat Π΄ΠΎΠ΄Π΅ΠΊΠ° сС Ρ€Π΅ΠΏΡ€ΠΎΠ΄ΡƒΡ†ΠΈΡ€Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚, ΠΈΠ»ΠΈ Π‘ΠΈΠΎΠ»Π°Ρ‚Π΅Π½Ρ†ΠΈΡ˜Π° Π½Π° скрипта BCC, кој сС заснова Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ ΠΈ ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° смСтководството Π½Π° Π±Π°Ρ€Π°ΡšΠ°Ρ‚Π°. Ниту Π΅Π΄Π½Π° ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ Π°Π»Π°Ρ‚ΠΊΠΈ Π½Π΅ΠΌΠ° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π·Π° Π±Π°Ρ€Π°ΡšΠ° Π΄ΠΎ ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ΠΈΠΎΡ‚ диск.

Ако ја ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° generic_make_request(), Ρ‚ΠΎΠ³Π°Ρˆ ќС Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΏΡ€Π΅Π΄ Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ со смСтководство, сС ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°Π°Ρ‚ ΡƒΡˆΡ‚Π΅ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΡ€Π²ΠΎ - generic_make_request_checks(), Π²Ρ€ΡˆΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° лСгитимноста Π½Π° Π±Π°Ρ€Π°ΡšΠ΅Ρ‚ΠΎ Π²ΠΎ врска со поставкитС Π½Π° дискот. Π’Ρ‚ΠΎΡ€ΠΎ - blk_queue_enter(), кој ΠΈΠΌΠ° интСрСсСн ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊ wait_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_Π·Π°ΠΌΡ€Π·Π½ΡƒΠ²Π°ΡšΠ΅_Π΄Π»Π°Π±ΠΎΡ‡ΠΈΠ½Π°. ПослС ΠΎΠ²Π°, ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Ρ‡Π΅ΠΊΠ° Π΄Π° сС испразни Ρ€Π΅Π΄ΠΈΡ†Π°Ρ‚Π° 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 ΠΊΠΎΠ³Π° Π½Π΅ΠΌΠ° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° дискот (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΡ€Π΅Π΄ΠΎΡ‚ Π½Π΅ Π΅ ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°Π½/исклучСн) Π½Π΅ Π΅ Π΄ΠΎΠ±Ρ€Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. Π‘Π΅ΠΏΠ°ΠΊ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΌΡƒ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ΠΌΠ΅ Π½Π° ΠΊΠ΅Ρ€Π½Π΅Π»ΠΎΡ‚ Π΄Π° Π½Π΅ ΠΏΡ€Π°Π²ΠΈ Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΈ Π΄Π° Π³ΠΎ Π·Π°ΠΌΡ€Π·Π½Π΅ Ρ€Π΅Π΄ΠΎΡ‚ Π·Π° Π±Π°Ρ€Π°ΡšΠ΅ Π°ΠΊΠΎ Ρ‚ΠΎΠ° Π½Π΅ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ. Π’Ρ€ΠΈ ΠΌΠ°Π»ΠΈ посвСтат ΠΏΠΎΠΏΡ€Π°Π²Π΅Ρ‚Π΅ ја ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π°.

Π—Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ

eBPF Π΅ ΠΌΠ½ΠΎΠ³Ρƒ флСксибилна ΠΈ моќна Π°Π»Π°Ρ‚ΠΊΠ°. Π’ΠΎ написот Ρ€Π°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ Π΅Π΄Π΅Π½ ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅Π½ ΡΠ»ΡƒΡ‡Π°Ρ˜ ΠΈ дСмонстриравмС ΠΌΠ°Π» Π΄Π΅Π» ΠΎΠ΄ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ. Ако стС заинтСрСсирани Π·Π° Ρ€Π°Π·Π²ΠΎΡ˜ Π½Π° BCC ΠΊΠΎΠΌΡƒΠ½Π°Π»Π½ΠΈ услуги, Π²Ρ€Π΅Π΄ΠΈ Π΄Π° сС ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π΅Π½ Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΡ˜Π°Π», кој Π΄ΠΎΠ±Ρ€ΠΎ Π³ΠΈ ΠΎΠΏΠΈΡˆΡƒΠ²Π° основитС.

ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ интСрСсни Π°Π»Π°Ρ‚ΠΊΠΈ Π·Π° Π΄Π΅Π±Π°Π³ΠΈΡ€Π°ΡšΠ΅ ΠΈ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€Π°ΡšΠ΅ Π±Π°Π·ΠΈΡ€Π°Π½ΠΈ Π½Π° eBPF. Π•Π΄Π΅Π½ ΠΎΠ΄ Π½ΠΈΠ² - bpftrace, кој Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ моќни Π΅Π΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½ΠΈ Π»ΠΈΠ½ΠΈΠΈ ΠΈ ΠΌΠ°Π»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Π½Π° јазик сличСн Π½Π° awk. Π”Ρ€ΡƒΠ³ΠΎ - ebpf_exporter, Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° собиратС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π½Π° ниско Π½ΠΈΠ²ΠΎ ΠΈ со висока Ρ€Π΅Π·ΠΎΠ»ΡƒΡ†ΠΈΡ˜Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ Π²Π°ΡˆΠΈΠΎΡ‚ сСрвСр Prometheus, со моТност ΠΏΠΎΠ΄ΠΎΡ†Π½Π° Π΄Π° Π΄ΠΎΠ±ΠΈΠ²Π°Ρ‚Π΅ ΡƒΠ±Π°Π²ΠΈ Π²ΠΈΠ·ΡƒΠ΅Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, ΠΏΠ° Π΄ΡƒΡ€ΠΈ ΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ°.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€