αž–αžΈ High Ceph Latency αž‘αŸ… Kernel Patch αžŠαŸ„αž™αž”αŸ’αžšαžΎ eBPF/BCC

αž–αžΈ High Ceph Latency αž‘αŸ… Kernel Patch αžŠαŸ„αž™αž”αŸ’αžšαžΎ eBPF/BCC

αž›αžΈαž“αž»αž…αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαžαžΊαžŽαŸ‚αž› αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ” αž–αž½αž€αžœαžΆαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž˜αžΆαž“αž•αž›αž”αŸ‰αŸ‡αž–αžΆαž›αŸ‹αž’αžœαž·αž‡αŸ’αž‡αž˜αžΆαž“αž›αžΎαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž˜αž·αž“αž’αžΆαž…αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ’αž“αž»αž„αž•αž›αž·αžαž€αž˜αŸ’αž˜αž”αžΆαž“αž‘αŸαŸ”

αž–αžΈαžšαž”αžΈαž†αŸ’αž“αžΆαŸ†αž˜αž»αž“αž˜αžΆαž“ αž§αž”αž€αžšαžŽαŸαž˜αž½αž™αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„ β€” eBPF αŸ” αžœαžΆαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž’αžΆαž…αžαžΆαž˜αžŠαžΆαž“αžαžΊαžŽαŸ‚αž› αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ„αž™αž…αŸ†αžŽαžΆαž™αžαž·αž… αž“αž·αž„αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΎαž„αžœαž·αž‰ αž“αž·αž„αž•αŸ’αž‘αž»αž€αž˜αŸ‰αžΌαžŒαž»αž›αž—αžΆαž‚αžΈαž‘αžΈαž”αžΈαž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΊαžŽαŸ‚αž›αž“αŸ„αŸ‡αž‘αŸαŸ”

αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αžΆαž…αŸ’αžšαžΎαž“αžšαž½αž…αž αžΎαž™αžŠαŸ‚αž›αž”αŸ’αžšαžΎ eBPF αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αžšαž”αŸ€αž”αžŸαžšαžŸαŸαžšαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αž˜αŸ’αžšαž„αŸ‹αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αŸ” PythonBCC. αž’αžαŸ’αžαž”αž‘αž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž–αž·αžαŸ” αž™αžΎαž„αž“αžΉαž„αž…αŸαž‰αž–αžΈαž”αž‰αŸ’αž αžΆαžŠαžΎαž˜αŸ’αž”αžΈαž‡αž½αžŸαž‡αž»αž› αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž‡αžΆαž€αŸ‹αž›αžΆαž€αŸ‹αŸ”

Ceph αž‚αžΊαž™αžΊαž

αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ…αž€αŸ’αžšαž»αž˜ Ceph αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž•αŸ’αž‘αŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž½αž™αž…αŸ†αž“αž½αž“αž‘αŸ…αžœαžΆ αž™αžΎαž„αžŸαž„αŸ’αž€αŸαžαžƒαžΎαž‰αžαžΆαž›αŸ’αž”αžΏαž“αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαžŸαžšαžŸαŸαžšαžŸαŸ†αžŽαžΎαžŠαŸ„αž™αžœαžΆαž‘αžΆαž”αž‡αžΆαž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž–αžΈ High Ceph Latency αž‘αŸ… Kernel Patch αžŠαŸ„αž™αž”αŸ’αžšαžΎ eBPF/BCC
αž˜αž·αž“αžŠαžΌαž…αžœαŸαž‘αž·αž€αžΆαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αŸ αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αŸαŸ‡αž”αžΆαž“αž”αŸ’αžšαžΎ bcache αž“αž·αž„αžαžΊαžŽαŸ‚αž› linux 4.15 αžαŸ’αž˜αžΈαŸ” αž“αŸαŸ‡αž‡αžΆαž›αžΎαž€αžŠαŸ†αž”αžΌαž„αžŠαŸ‚αž›αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ” αž αžΎαž™αž“αŸ…αž–αŸαž›αž“αŸ„αŸ‡ αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹αžαžΆαž«αžŸαž‚αž›αŸ‹αž“αŸƒαž”αž‰αŸ’αž αžΆαž’αžΆαž…αž‡αžΆαž‘αŸ’αžšαžΉαžŸαŸ’αžαžΈαŸ”

αž€αžΆαžšαžŸαŸŠαžΎαž”αž’αž„αŸ’αž€αŸαžαž˜αŸ’αž…αžΆαžŸαŸ‹αž•αŸ’αž‘αŸ‡

αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž˜αžΎαž›αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš ceph-osd αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ αž›αŸ’αž’ ΠΈ αž€αŸ‚αžœαž–αž„αŸ’αžšαžΈαž€ (αž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž’αŸ†αž–αžΈαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“ αž“αŸ…αž‘αžΈαž“αŸαŸ‡):

αž–αžΈ High Ceph Latency αž‘αŸ… Kernel Patch αžŠαŸ„αž™αž”αŸ’αžšαžΎ eBPF/BCC
αžšαžΌαž”αž—αžΆαž–αž”αŸ’αžšαžΆαž”αŸ‹αž™αžΎαž„αžαžΆαž˜αž»αžαž„αžΆαžš fdatasync() αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αž»αžαž„αžΆαžš generic_make_request(). αž“αŸαŸ‡αž˜αžΆαž“αž“αŸαž™αžαžΆαž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž‘αŸ†αž“αž„αž‡αžΆαž˜αžΌαž›αž αŸαžαž»αž“αŸƒαž”αž‰αŸ’αž αžΆαž‚αžΊαž“αŸ…αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆαž˜αž½αž™αž“αŸ…αžαžΆαž„αž€αŸ’αžšαŸ… osd daemon αžαŸ’αž›αž½αž“αžœαžΆαž•αŸ’αž‘αžΆαž›αŸ‹αŸ” αž“αŸαŸ‡αž’αžΆαž…αž‡αžΆαžαžΊαžŽαŸ‚αž› αž¬αžαžΆαžŸαŸ” αž‘αž·αž“αŸ’αž“αž•αž› iostat αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž–αžΈαž—αžΆαž–αž™αžΊαžαž™αŸ‰αžΆαžœαžαŸ’αž–αžŸαŸ‹αž€αŸ’αž“αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ†αžŽαžΎαžŠαŸ„αž™αžαžΆαžŸ bcache αŸ”

αž“αŸ…αž–αŸαž›αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž™αžΎαž„αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžαžΆαžŠαŸαž˜αž·αž“ systemd-udevd αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž–αŸαž›αžœαŸαž›αžΆαžŸαŸŠαžΈαž—αžΈαž™αžΌαž…αŸ’αžšαžΎαž“ - αž”αŸ’αžšαž αŸ‚αž› 20% αž“αŸ…αž›αžΎαžŸαŸ’αž“αžΌαž›αž‡αžΆαž…αŸ’αžšαžΎαž“αŸ” αž“αŸαŸ‡β€‹αž‡αžΆβ€‹αž’αžΆαž€αž”αŸ’αž”αž€αž·αžšαž·αž™αžΆβ€‹αž…αž˜αŸ’αž›αŸ‚αž€ αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αžŸαŸ’αžœαŸ‚αž„β€‹αžšαž€β€‹αž˜αžΌαž›αž αŸαžαž»αŸ” αžŠαŸ„αž™αžŸαžΆαžš Systemd-udevd αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ uevents αž™αžΎαž„αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž˜αžΎαž›αž–αž½αž€αžœαžΆαžαžΆαž˜αžšαž™αŸˆ αž˜αŸ‰αžΌαž“αžΈαž‘αŸαžš udevadm. αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆαž˜αž½αž™αž…αŸ†αž“αž½αž“αž’αŸ†αž“αŸƒαž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž§αž”αž€αžšαžŽαŸαž”αŸ’αž›αž»αž€αž“αžΈαž˜αž½αž™αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αŸ” αž“αŸαŸ‡β€‹αž‚αžΊβ€‹αž‡αžΆβ€‹αžšαžΏαž„β€‹αž˜αž·αž“β€‹αž’αž˜αŸ’αž˜αžαžΆ αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž™αžΎαž„β€‹αž“αžΉαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αž–αž·αž“αž·αžαŸ’αž™β€‹αž˜αžΎαž›β€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸβ€‹αž‘αžΆαŸ†αž„β€‹αž’αžŸαŸ‹β€‹αž“αŸαŸ‡αŸ”

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ BCC Toolkit

αžŠαžΌαž…αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αžšαž€αžƒαžΎαž‰αžšαž½αž…αž αžΎαž™ αžαžΊαžŽαŸ‚αž› (αž“αž·αž„ ceph daemon αž€αŸ’αž“αž»αž„αž€αžΆαžšαž αŸ…αž”αŸ’αžšαž–αŸαž“αŸ’αž’) αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž…αŸ’αžšαžΎαž“αž€αŸ’αž“αž»αž„ generic_make_request(). αžαŸ„αŸ‡αž–αŸ’αž™αžΆαž™αžΆαž˜αžœαžΆαžŸαŸ‹αž›αŸ’αž”αžΏαž“αž“αŸƒαž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αŸ” IN αž…αž˜αŸ’αž›αž„αž‡αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‡αžΌαž“ αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸαž’αžŸαŸ’αž…αžΆαžšαŸ’αž™αžšαž½αž…αž‘αŸ…αž αžΎαž™ - αž—αžΆαž–αžŸαŸŠαžΈαžŸαž„αŸ’αžœαžΆαž€αŸ‹αž‚αŸ’αž“αžΆαŸ”. αž™αžΎαž„αž“αžΉαž„αžαžΆαž˜αžŠαžΆαž“αžŠαŸαž˜αž·αž“αžŠαŸ„αž™ PID αžšαž”αžŸαŸ‹αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž…αž“αŸ’αž›αŸ„αŸ‡αž–αŸαž› 1 αžœαž·αž“αžΆαž‘αžΈαžšαžœαžΆαž„αž›αž‘αŸ’αž’αž•αž› αž“αž·αž„αž›αž‘αŸ’αž’αž•αž›αž‡αžΆαž˜αžΈαž›αžΈαžœαž·αž“αžΆαž‘αžΈαŸ”

αž–αžΈ High Ceph Latency αž‘αŸ… Kernel Patch αžŠαŸ„αž™αž”αŸ’αžšαžΎ 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 trigger αž‡αžΆαž‘αŸ€αž„αž‘αžΆαžαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž uevents αŸ”

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž§αž”αž€αžšαžŽαŸαž•αŸ’αž’αŸ‚αž€αž›αžΎ BCC

αžαŸ„αŸ‡αž–αŸ’αž™αžΆαž™αžΆαž˜αžŸαžšαžŸαŸαžšαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαžαžΆαž˜αžŠαžΆαž“ αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž€αžΆαžšαž αŸ…αž‘αžΌαžšαžŸαž–αŸ’αž‘αž™αžΊαžαž”αŸ†αž•αž»αžαŸ” generic_make_request(). αž™αžΎαž„αž€αŸαž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž›αžΎαžˆαŸ’αž˜αŸ„αŸ‡αžšαž”αžŸαŸ‹ drive αžŠαŸ‚αž›αž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαŸ”

αž•αŸ‚αž“αž€αžΆαžšαž‚αžΊαžŸαžΆαž˜αž‰αŸ’αž‰αŸ–

  • αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ kprobe αž“αŸ…αž›αžΎ generic_make_request():
    • αž™αžΎαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžŸαž‘αŸ…αž€αŸ’αž“αž»αž„αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ† αž’αžΆαž…αž…αžΌαž›αž”αŸ’αžšαžΎαž”αžΆαž“αžαžΆαž˜αžšαž™αŸˆαž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹αž˜αž»αžαž„αžΆαžšαŸ”
    • αž™αžΎαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžαŸ’αžšαžΆαž–αŸαž›αžœαŸαž›αžΆαŸ”

  • αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ kretprobe αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžαŸ’αžšαž‘αž”αŸ‹αž˜αž€αžœαž·αž‰αž–αžΈ generic_make_request():
    • αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžαŸ’αžšαžΆαž–αŸαž›αžœαŸαž›αžΆαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“;
    • αž™αžΎαž„αžšαž€αž˜αžΎαž›αžαŸ’αžšαžΆαž–αŸαž›αžœαŸαž›αžΆαžŠαŸ‚αž›αž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€ αž αžΎαž™αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αžœαžΆαž‡αžΆαž˜αž½αž™αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αŸ”
    • αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž›αž‘αŸ’αž’αž•αž›αž‚αžΊαž’αŸ†αž‡αžΆαž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ„αŸ‡αž™αžΎαž„αžšαž€αžƒαžΎαž‰αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžŸαžŠαŸ‚αž›αž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž αžΎαž™αž”αž„αŸ’αž αžΆαž‰αžœαžΆαž“αŸ…αž›αžΎαžŸαŸ’αžαžΆαž“αžΈαž™αŸ”

Kprobes ΠΈ kretprobes αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαž”αŸ†αž”αŸ‚αž€αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΌαžŠαž˜αž»αžαž„αžΆαžšαž—αŸ’αž›αžΆαž˜αŸ—αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“ αž―αž€αžŸαžΆαžš ΠΈ αž›αŸ’αž’ αž’αžαŸ’αžαž”αž‘αž›αžΎαž”αŸ’αžšαž’αžΆαž“αž”αž‘αž“αŸαŸ‡αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž›αŸαžαž€αžΌαžŠαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αžŸαŸαž„αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„ αž…αž˜αŸ’αž›αž„αž‡αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž‡αžΌαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€ αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αžαžΆαž–αž½αž€αž‚αŸαž˜αžΆαž“αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αŸαŸ‡αž”αž·αž‘αŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αžšαŸ†αž›αž„αž€αžΆαžšαž‰αŸ‚αž€αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž’αžΆαž‚αž»αž™αž˜αŸ‰αž„αŸ‹ αž αžΎαž™αž”αž“αŸ’αžαž‘αŸ…αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αžαŸ’αž›αž½αž“αž―αž„αŸ”

αž’αžαŸ’αžαž”αž‘ eBPF αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” python αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

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

αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αžšαžœαžΆαž„αž˜αž»αžαž„αžΆαžš αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ eBPF αž”αŸ’αžšαžΎ αžαžΆαžšαžΆαž„ hash. αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš 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);

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžšαžΆαž„ hash αžŠαŸ‚αž›αž αŸ…αžαžΆ pαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ’αžšαž—αŸαž‘αž‚αž“αŸ’αž›αžΉαŸ‡ u64 αž“αž·αž„αžαž˜αŸ’αž›αŸƒαž“αŸƒαž”αŸ’αžšαž—αŸαž‘ αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ data_t. αžαžΆαžšαžΆαž„αž“αžΉαž„αž˜αžΆαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ BPF αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž˜αŸ‰αžΆαž€αŸ’αžšαžΌ BPF_PERF_OUTPUT αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžšαžΆαž„αž˜αž½αž™αž‘αŸ€αžαž αŸ…αžαžΆ αž–αŸ’αžšαžΉβ€‹αžαŸ’αžβ€‹αž€αžΆαžšαžŽαŸαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹ αž€αžΆαžšαž”αž‰αŸ’αž‡αžΌαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž‘αŸ…αž€αŸ’αž“αž»αž„αž…αž“αŸ’αž›αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž“αŸ…αž–αŸαž›αžœαžΆαžŸαŸ‹αž€αžΆαžšαž–αž“αŸ’αž™αžΆαžšαž–αŸαž›αžšαžœαžΆαž„αž€αžΆαžšαž αŸ…αž˜αž»αžαž„αžΆαžšαž˜αž½αž™ αž“αž·αž„αž€αžΆαžšαžαŸ’αžšαž›αž”αŸ‹αž–αžΈαžœαžΆ αž¬αžšαžœαžΆαž„αž€αžΆαžšαž αŸ…αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αž»αžαž„αžΆαžšαž•αŸ’αžŸαŸαž„αŸ— αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž‚αž·αžαž‚αžΌαžšαžαžΆαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αžαŸ’αžšαžΌαžœαžαŸ‚αž‡αžΆαžšαž”αžŸαŸ‹αž”αžšαž·αž”αž‘αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž˜αŸ’αž™αŸ‰αžΆαž„αžœαž·αž‰αž‘αŸ€αž αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž…αž„αž…αžΆαŸ†αž’αŸ†αž–αžΈαž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αŸ‰αžΆαžšαŸ‰αžΆαž‘αŸ‚αž›αžŠαŸ‚αž›αž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αž“αŸƒαž˜αž»αžαž„αžΆαžšαŸ” αž™αžΎαž„αž˜αžΆαž“αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαžœαžΆαžŸαŸ‹αžŸαŸ’αž‘αž„αŸ‹αž—αžΆαž–αž™αžΊαžαž™αŸ‰αžΆαžœαžšαžœαžΆαž„αž€αžΆαžšαž αŸ…αž˜αž»αžαž„αžΆαžšαž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™ αž“αž·αž„αžαŸ’αžšαž‘αž”αŸ‹αž–αžΈαž˜αž»αžαž„αžΆαžšαž“αŸ„αŸ‡αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž“αŸαŸ‡αž‘αŸ†αž“αž„αž‡αžΆαž‚αŸ’αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‘αŸαŸ” αž§αž‘αžΆαž αžšαžŽαŸαžŠαŸαž›αŸ’αž’αž˜αž½αž™αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ biolatencyαžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž‚αŸ’αžšαžΆαž”αŸ‹αž…αž»αž…αžαžΆαžšαžΆαž„ hash αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸ…αž‡αžΆαž‘αŸ’αžšαž“αž·αž…αž‘αŸ… αžŸαŸ†αžŽαžΎαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž†αŸ’αž›αž»αŸ‡αž”αž‰αŸ’αž…αžΆαŸ†αž„αž–αžΈαžŸαŸ†αžŽαžΎαžŒαžΈαžŸαž˜αž½αž™αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŸαžšαžŸαŸαžšαž€αžΌαžŠαžŠαŸ‚αž›αž“αžΉαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αž»αžαž„αžΆαžšαžŠαŸ‚αž›αž€αŸ†αž–αž»αž„αžŸαž·αž€αŸ’αžŸαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαŸ–

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 αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž”αž‘αžŠαŸ‚αž›αž™αžΎαž„αž€αŸ†αž–αž»αž„αž’αŸ’αžœαžΎαž€αžΆαžš αž“αž·αž„αžαŸ’αžšαžΆαž–αŸαž›αžœαŸαž›αžΆαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‚αž·αžαž‡αžΆ nanoseconds αŸ” αž™αžΎαž„β€‹αžŸαžšαžŸαŸαžšβ€‹αžœαžΆβ€‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸβ€‹αžαŸ’αž˜αžΈαŸ— αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ data_t αž‘αž·αž“αŸ’αž“αž“αŸαž™. αž™αžΎαž„αž‘αž‘αž½αž›αž”αžΆαž“αžˆαŸ’αž˜αŸ„αŸ‡αžαžΆαžŸαž–αžΈαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž‡αžΈαžœαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž“αŸ…αž–αŸαž›αž αŸ… generic_make_request()αž αžΎαž™αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαž€αŸ’αž“αž»αž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž‘αž·αž“αŸ’αž“αž“αŸαž™. αž‡αŸ†αž αžΆαž“αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαžαŸ’αžšαžΌαžœαž”αž“αŸ’αžαŸ‚αž˜αž’αžΆαžαž»αž‘αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„ hash αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αžšαžΆαž”αŸ‹αž–αžΈαž˜αž»αž“αŸ”

αž˜αž»αžαž„αžΆαžšαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž αŸ…αž“αŸ…αž–αŸαž›αžαŸ’αžšαž‘αž”αŸ‹αž–αžΈ 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 αž“αŸƒαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž–αŸαž›αžœαŸαž›αžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αž»αŸ†αž”αŸ‚αž„αž…αŸ‚αž€αž’αž„αŸ’αž‚αž…αž„αž…αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αž·αž“αŸ’αž“αž“αŸαž™αžαŸ’αž˜αžΈαŸ” αž‡αŸ†αž“αž½αžŸαž˜αž€αžœαž·αž‰ αž™αžΎαž„αžŸαŸ’αžœαŸ‚αž„αžšαž€αžαžΆαžšαžΆαž„ hash αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎαž‚αž“αŸ’αž›αžΉαŸ‡ == αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“ 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")

αž™αžΎαž„αž€αŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž•αž„αžŠαŸ‚αžšαŸ” αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ 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αŸ–

αž–αžΈ High Ceph Latency αž‘αŸ… Kernel Patch αžŠαŸ„αž™αž”αŸ’αžšαžΎ 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_freeze_depth. αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸαŸ‡ αžαžΊαžŽαŸ‚αž›αž€αŸ†αž–αž»αž„αžšαž„αŸ‹αž…αžΆαŸ†αž‡αž½αžšαž‘αž‘αŸ blk_mq_freeze_queue_wait().

αž–αŸαž›αžœαŸαž›αžΆαžŠαŸ‚αž›αžœαžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž‡αž˜αŸ’αžšαŸ‡αž‡αž½αžšαž“αŸαŸ‡αž‚αžΊαžŸαŸ’αž˜αžΎαž“αžΉαž„αž—αžΆαž–αž™αžΊαžαž“αŸƒαžαžΆαžŸ αžŠαŸ„αž™αžŸαžΆαžšαžαžΊαžŽαŸ‚αž›αžšαž„αŸ‹αž…αžΆαŸ†αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŠαŸ‚αž›αž”αžΆαž“αžŠαžΆαž€αŸ‹αž‡αžΆαž‡αž½αžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž…αž”αŸ‹αŸ” αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‡αž½αžšαž‘αž‘αŸ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ blk_mq_unfreeze_queue()αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž€αžΆαžšαžšαžΆαž”αŸ‹ freeze_depth.

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αžŠαžΉαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ‚αžαž˜αŸ’αžšαžΌαžœαžŸαŸ’αžαžΆαž“αž—αžΆαž–αŸ” αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž€αŸαŸ‡ 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 αŸ” αž˜αŸ’αž“αžΆαž€αŸ‹β€‹αž€αŸ’αž“αž»αž„β€‹αž…αŸ†β€‹αž“αŸ„αž˜β€‹αž–αž½αž€αž‚αŸ - bpfraceαžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαž’αž€αŸ’αžŸαžšαž˜αž½αž™αžŠαŸαž˜αžΆαž“αž’αžΆαž“αž»αž—αžΆαž– αž“αž·αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαžΌαž…αŸ—αž€αŸ’αž“αž»αž„αž—αžΆαžŸαžΆαžŠαžΌαž… awk αŸ” αž˜αž½αž™αž‘αŸ€αž - ebpf_exporterαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αŸ’αžšαž˜αžΌαž›αžšαž„αŸ’αžœαžΆαžŸαŸ‹αž€αž˜αŸ’αžšαž·αžαž‘αžΆαž” αž‚αž»αžŽαž—αžΆαž–αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž–αžŸαŸ‹αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž‘αŸ…αž€αŸ’αž“αž»αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ prometheus αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž‘αž‘αž½αž›αž”αžΆαž“αžšαžΌαž”αž—αžΆαž–αžŠαŸαžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαž αž“αž·αž„αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž“αŸ…αž–αŸαž›αž€αŸ’αžšαŸ„αž™αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹