ืคึฟื•ืŸ ื”ื•ื™ืš ืกืขืฃ ืœืึทื˜ืึทื ืกื™ ืฆื• ืงืขืจื ืขืœ ืคึผืึทื˜ืฉ ื ื™ืฆืŸ eBPF / BCC

ืคึฟื•ืŸ ื”ื•ื™ืš ืกืขืฃ ืœืึทื˜ืึทื ืกื™ ืฆื• ืงืขืจื ืขืœ ืคึผืึทื˜ืฉ ื ื™ืฆืŸ eBPF / BCC

ืœื™ื ื•ืงืก ื”ืื˜ ืึท ื’ืจื•ื™ืก ื ื•ืžืขืจ ืคื•ืŸ ืžื›ืฉื™ืจื™ื ืคึฟืึทืจ ื“ื™ื‘ืึทื’ื™ื ื’ ื“ื™ ืงืขืจืŸ ืื•ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–. ืจื•ื‘ึฟ ืคื•ืŸ ื–ื™ื™ ื”ืึธื‘ืŸ ืึท ื ืขื’ืึทื˜ื™ื•ื• ืคึผืจืึทืœ ืื•ื™ืฃ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ืŸ ืงืขื ืขืŸ ื ื™ื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข.

ื ืคึผืึธืจ ืคื•ืŸ ื™ืึธืจืŸ ืฆื•ืจื™ืง ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืืŸ ืื ื“ืขืจ ื’ืขืฆื™ื™ึทื’ ืื™ื– ื“ืขื•ื•ืขืœืึธืคึผืขื“ - eBPF. ืขืก ืžืื›ื˜ ืขืก ืžืขื’ืœืขืš ืฆื• ืฉืคึผื•ืจ ื“ื™ ืงืขืจืŸ ืื•ืŸ ื‘ืึทื ื™ืฆืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ืžื™ื˜ ื ื™ื“ืขืจื™ืง ืึธื•ื•ื•ืขืจื›ืขื“ ืื•ืŸ ืึธืŸ ื“ื™ ื ื•ื™ื˜ ืฆื• ืจื™ื‘ื™ืœื“ ืžื’ื™ืœื” ืื•ืŸ ืœืึธื“ืŸ ื“ืจื™ื˜-ืคึผืึทืจื˜ื™ื™ ืžืึทื“ื–ืฉื•ืœื– ืื™ืŸ ื“ื™ ืงืขืจืŸ.

ืขืก ื–ืขื ืขืŸ ืฉื•ื™ืŸ ืคื™ืœืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื™ื•ื˜ื™ืœืึทื˜ื™ื– ื•ื•ืึธืก ื ื•ืฆืŸ eBPF, ืื•ืŸ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ื•ื•ืขืœืŸ ืงื•ืงืŸ ืื™ืŸ ื•ื•ื™ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืคึผืจืึธืคื™ืœื™ื ื’ ื™ื•ื˜ื™ืœืึทื˜ื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ืขืจ ื‘ื™ื‘ืœื™ืึธื˜ืขืง PythonBCC. ื“ืขืจ ืึทืจื˜ื™ืงืœ ืื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ืคืึทืงื˜ื™ืฉ ื’ืขืฉืขืขื ื™ืฉืŸ. ืžื™ืจ ื•ื•ืขืœืŸ ื’ื™ื™ืŸ ืคื•ืŸ ืคึผืจืึธื‘ืœืขื ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ืฆื• ื•ื•ื™ื™ึทื–ืŸ ื•ื•ื™ ื™ื’ื–ื™ืกื˜ื™ื ื’ ื™ื•ื˜ื™ืœืึทื˜ื™ื– ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื™ื ื˜ ืื™ืŸ ืกืคึผืขืฆื™ืคื™ืฉ ืกื™ื˜ื•ืึทื˜ื™ืึธื ืก.

ืกืขืฃ ืื™ื– ืคึผืึทืžืขืœืขืš

ื ื ื™ื™ึทืข ื‘ืึทืœืขื‘ืึธืก ืื™ื– ืฆื•ื’ืขื’ืขื‘ืŸ ืฆื• ื“ื™ Ceph ืงื ื•ื™ืœ. ื ืึธืš ืžื™ื™ื’ืจื™ื™ื˜ื™ื ื’ ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื“ืึทื˜ืŸ ืฆื• ืขืก, ืžื™ืจ ื‘ืืžืขืจืงื˜ ืึทื– ื“ื™ ื’ื™ื›ืงื™ื™ึทื˜ ืคื•ืŸ ืคึผืจืึทืกืขืกื™ื ื’ ืฉืจื™ื™ึทื‘ืŸ ืจื™ืงื•ื•ืขืก ืื™ื– ืคื™ืœ ื ื™ื“ืขืจื™ืงืขืจ ื•ื•ื™ ืื•ื™ืฃ ืื ื“ืขืจืข ืกืขืจื•ื•ืขืจืก.

ืคึฟื•ืŸ ื”ื•ื™ืš ืกืขืฃ ืœืึทื˜ืึทื ืกื™ ืฆื• ืงืขืจื ืขืœ ืคึผืึทื˜ืฉ ื ื™ืฆืŸ eBPF / BCC
ื ื™ื˜ ืขื ืœืขืš ืื ื“ืขืจืข ืคึผืœืึทื˜ืคืึธืจืžืก, ื“ืขืจ ื‘ืึทืœืขื‘ืึธืก ื’ืขื•ื•ื™ื™ื ื˜ bcache ืื•ืŸ ื“ื™ ื ื™ื™ึทืข ืœื™ื ื•ืงืก 4.15 ืงืขืจืŸ. ื“ืึธืก ืื™ื– ื’ืขื•ื•ืขืŸ ื“ืขืจ ืขืจืฉื˜ืขืจ ืžืึธืœ ืึท ื‘ืึทืœืขื‘ืึธืก ืคื•ืŸ ื“ืขื ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ื– ื’ืขื ื™ืฆื˜ ื“ืึธ. ืื•ืŸ ืื™ืŸ ื“ืขื ืžืึธืžืขื ื˜ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืงืœืึธืจ ืึทื– ื“ืขืจ ื•ื•ืึธืจืฆืœ ืคื•ืŸ ื“ื™ ืคึผืจืึธื‘ืœืขื ืงืขืŸ ื˜ืขืึธืจืขื˜ื™ืฉ ื–ื™ื™ืŸ ืึทืœืฅ.

ื™ื ื•ื•ืขืกื˜ืึทื’ื™ื™ื˜ื™ื ื’ ื“ื™ ื‘ืึทืœืขื‘ืึธืก

ืœืึธืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ ืงื•ืงืŸ ืื™ืŸ ื•ื•ืึธืก ื›ืึทืคึผืึทื ื– ืื™ืŸ ื“ื™ ืกืขืฃ-ืึธืกื“ ืคึผืจืึธืฆืขืก. ืคึฟืึทืจ ื“ืขื ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ื’ืื ืฅ ะธ ืคืœืึทืžืขืกืงืึธืคึผืข (ืžืขืจ ื•ื•ืขื’ืŸ ื•ื•ืึธืก ืื™ืจ ืงืขื ืขืŸ ืœื™ื™ืขื ืขืŸ ื“ืึธ):

ืคึฟื•ืŸ ื”ื•ื™ืš ืกืขืฃ ืœืึทื˜ืึทื ืกื™ ืฆื• ืงืขืจื ืขืœ ืคึผืึทื˜ืฉ ื ื™ืฆืŸ eBPF / BCC
ื“ื™ ื‘ื™ืœื“ ื“ืขืจืฆื™ื™ืœื˜ ืื•ื ื“ื– ืึทื– ื“ื™ ืคึฟื•ื ืงืฆื™ืข fdatasync() ืคืืจื‘ืจืื›ื˜ ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ื˜ ืฆื• ืฉื™ืงืŸ ืึท ื‘ืงืฉื” ืฆื• ืคืึทื ื’ืงืฉืึทื ื– generic_make_request(). ื“ืขื ืžื™ื˜ืœ ืึทื– ืจื•ื‘ึฟ ืžืกืชึผืžื ื“ื™ ื’ืจื•ื ื˜ ืคื•ืŸ ื“ื™ ืคึผืจืึธื‘ืœืขืžืก ืื™ื– ืขืจื’ืขืฅ ืึทืจื•ื™ืก ื“ื™ ืึธืกื“ ื“ื™ื™ืžืึทืŸ ื–ื™ืš. ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ ื“ื™ ืงืขืจืŸ ืึธื“ืขืจ ื“ื™ืกืงืก. ื“ื™ ื™ืึธืกื˜ืึทื˜ ืจืขื–ื•ืœื˜ืึทื˜ ื’ืขื•ื•ื™ื–ืŸ ืึท ื”ื•ื™ืš ืœื™ื™ื˜ืึทื ืกื™ ืื™ืŸ ืคึผืจืึทืกืขืกื™ื ื’ ืจื™ืงื•ื•ืขืก ื“ื•ืจืš bcache ื“ื™ืกืงืก.

ื•ื•ืขืŸ ืงืึธื ื˜ืจืึธืœื™ืจืŸ ื“ืขื ื‘ืึทืœืขื‘ืึธืก, ืžื™ืจ ื’ืขืคึฟื•ื ืขืŸ ืึทื– ื“ื™ systemd-udevd ื“ื™ื™ืžืึทืŸ ืงืึทื ืกื•ืžื– ืึท ื’ืจื•ื™ืก ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ืงืคึผื• ืฆื™ื™ื˜ - ื•ื•ืขื’ืŸ 20% ืื•ื™ืฃ ืขื˜ืœืขื›ืข ืงืึธืจืขืก. ื“ืึธืก ืื™ื– ืžืึธื“ื ืข ื ืึทื˜ื•ืจ, ืึทื–ื•ื™ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขืคึฟื™ื ืขืŸ ืื•ื™ืก ื•ื•ืึธืก. ื–ื™ื ื˜ Systemd-udevd ืึทืจื‘ืขื˜ ืžื™ื˜ ื™ื•ืขื•ื•ืขื ื˜, ืžื™ืจ ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืงื•ืงืŸ ืื™ืŸ ื–ื™ื™ ื•ื“ืขื•ื•ืึทื“ื ืžืึธื ื™ื˜ืึธืจ. ืขืก ื˜ื•ืจื ืก ืื•ื™ืก ืึทื– ืึท ื’ืจื•ื™ืก ื ื•ืžืขืจ ืคื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ื’ืขืฉืขืขื ื™ืฉืŸ ื–ืขื ืขืŸ ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืคึฟืึทืจ ื™ืขื“ืขืจ ื‘ืœืึธืง ืžื™ื˜ืœ ืื™ืŸ ื“ื™ ืกื™ืกื˜ืขื. ื“ืึธืก ืื™ื– ื’ืึทื ืฅ ื•ืžื’ืขื•ื•ื™ื™ื ื˜ืœืขืš, ืึทื–ื•ื™ ืžื™ืจ ื•ื•ืขืœืŸ ื”ืึธื‘ืŸ ืฆื• ืงื•ืงืŸ ืื™ืŸ ื•ื•ืึธืก ื“ื–ืฉืขื ืขืจื™ื™ืฅ ืึทืœืข ื“ื™ ื’ืขืฉืขืขื ื™ืฉืŸ.

ื ื™ืฆืŸ ื“ื™ BCC Toolkit

ื•ื•ื™ ืžื™ืจ ื”ืึธื‘ืŸ ืฉื•ื™ืŸ ื’ืขืคื•ื ืขืŸ, ื“ืขืจ ืงืขืจืŸ (ืื•ืŸ ื“ื™ ืกืขืฃ ื“ื™ื™ืžืึทืŸ ืื™ืŸ ื“ื™ ืกื™ืกื˜ืขื ืจื•ืคืŸ) ืกืคึผืขื ื“ื– ืึท ืคึผืœืึทืฅ ืคื•ืŸ ืฆื™ื™ื˜ ืื™ืŸ generic_make_request(). ื–ืืœ ืก ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืžืขืกื˜ืŸ ื“ื™ ื’ื™ื›ืงื™ื™ึทื˜ ืคื•ืŸ ื“ืขื ืคึฟื•ื ืงืฆื™ืข. ืื™ืŸ ื‘ืงืง ืขืก ืื™ื– ืฉื•ื™ืŸ ืึท ื•ื•ื•ื ื“ืขืจืœืขืš ื ื•ืฆืŸ - ืคื•ื ืงืฆื™ืึธื ื™ืจืŸ. ืžื™ืจ ื•ื•ืขืœืŸ ืฉืคึผื•ืจ ื“ื™ ื“ื™ื™ืžืึทืŸ ื“ื•ืจืš ื–ื™ื™ืŸ PID ืžื™ื˜ ืึท 1 ืจื’ืข ืžืขื”ืึทืœืขืš ืฆื•ื•ื™ืฉืŸ ืึทื•ื˜ืคึผื•ืฅ ืื•ืŸ ืจืขื–ื•ืœื˜ืึทื˜ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ืื™ืŸ ืžื™ืœื™ืกืขืงืึทื ื“ื–.

ืคึฟื•ืŸ ื”ื•ื™ืš ืกืขืฃ ืœืึทื˜ืึทื ืกื™ ืฆื• ืงืขืจื ืขืœ ืคึผืึทื˜ืฉ ื ื™ืฆืŸ eBPF / BCC
ื“ืขืจ ืฉื˜ืจื™ืš ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ืึทืจื‘ืขื˜ ื’ืขืฉื•ื•ื™ื ื“. ื›ืœ ืขืก ื˜ื•ื˜ ืื™ื– ืคืึธืจืŸ ื“ื™ ื‘ืงืฉื” ืฆื• ื“ื™ ืžื™ื˜ืœ ื“ืจื™ื™ื•ื•ืขืจ ืจื™ื™.

ื‘ืงืึทื˜ืฉืข ืื™ื– ืึท ืงืึธืžืคึผืœืขืงืก ืžื™ื˜ืœ ื•ื•ืึธืก ืึทืงืฉืœื™ ื‘ืืฉื˜ื™ื™ื˜ ืคื•ืŸ ื“ืจื™ื™ ื“ื™ืกืงืก:

  • ื‘ืึทืงื™ื ื’ ืžื™ื˜ืœ (ืงืึทืฉื˜ ื“ื™ืกืง), ืื™ืŸ ื“ืขื ืคืึทืœ ืขืก ืื™ื– ืึท ืคึผืึทืžืขืœืขืš ื”ื“ื“;
  • ืงืึทื˜ืฉื™ื ื’ ืžื™ื˜ืœ (ืงืึทื˜ืฉื™ื ื’ ื“ื™ืกืง), ื“ืึธ ื“ืึธืก ืื™ื– ืื™ื™ืŸ ืฆืขื˜ื™ื™ืœื•ื ื’ ืคื•ืŸ ื“ื™ NVMe ืžื™ื˜ืœ;
  • ื“ื™ bcache ื•ื•ื™ืจื˜ื•ืึทืœ ืžื™ื˜ืœ ืžื™ื˜ ื•ื•ืึธืก ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืœื•ื™ืคื˜.

ืžื™ืจ ื•ื•ื™ืกืŸ ืึทื– ื“ื™ ื˜ืจืึทื ืกืžื™ืกื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื‘ืขื˜ืŸ ืื™ื– ืคึผืึทืžืขืœืขืš, ืึธื‘ืขืจ ืคึฟืึทืจ ื•ื•ืึธืก ืคื•ืŸ ื“ื™ ื“ืขื•ื•ื™ืกืขืก? ืžื™ืจ ื•ื•ืขืœืŸ ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ื“ืขื ืึท ื‘ื™ืกืœ ืฉืคึผืขื˜ืขืจ.

ืžื™ืจ ืื™ืฆื˜ ื•ื•ื™ืกืŸ ืึทื– ื™ื•ืขื•ื•ืขื ื˜ ื–ืขื ืขืŸ ืžืกืชึผืžื ืฆื• ืคืึทืจืฉืึทืคืŸ ืคึผืจืึธื‘ืœืขืžืก. ื’ืขืคึฟื™ื ืขืŸ ื•ื•ืึธืก ืคึผื•ื ืงื˜ ื– ื–ื™ื™ืขืจ ื“ื•ืจ ืื™ื– ื ื™ืฉื˜ ืึทื–ื•ื™ ื’ืจื™ื ื’. ื–ืืœ ืก ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ื“ืึธืก ืื™ื– ืึท ืกืึธืจื˜ ืคื•ืŸ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ื•ื•ืึธืก ืื™ื– ืคึผื™ืจื™ืึทื“ื™ืงืœื™ ืœืึธื ื˜ืฉื˜. ื–ืืœ ืก ื–ืขืŸ ื•ื•ืึธืก ืžื™ืŸ ืคื•ืŸ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืœื•ื™ืคื˜ ืื•ื™ืฃ ื“ื™ ืกื™ืกื˜ืขื ื ื™ืฆืŸ ืึท ืฉืจื™ืคื˜ execsnoop ืคื•ืŸ ื“ื™ ื–ืขืœื‘ืข ื‘ืงืง ื ื•ืฆืŸ ืงื™ื˜. ื–ืืœ ืก ืœื•ื™ืคืŸ ืขืก ืื•ืŸ ืฉื™ืงืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ ืฆื• ืึท ื˜ืขืงืข.

ืœืžืฉืœ ื•ื•ื™ ื“ืึธืก:

/usr/share/bcc/tools/execsnoop  | tee ./execdump

ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ื•ื•ื™ื™ึทื–ืŸ ื“ื™ ืคื•ืœ ืคึผืจืึธื“ื•ืงืฆื™ืข ืคื•ืŸ โ€‹โ€‹ืขืงืกืขืงืกื ืึธืึธืคึผ ื“ืึธ, ืึธื‘ืขืจ ืื™ื™ืŸ ืฉื•ืจื” ืคื•ืŸ ืื™ื ื˜ืขืจืขืก ืฆื• ืื•ื ื“ื– ื’ืขืงื•ืงื˜ ื•ื•ื™ ื“ืึธืก:

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 ืžื™ื˜ืœ ืื™ื– ื’ืขื•ื•ืขืŸ ืึทื–ื•ื™ ืคึผืึทืžืขืœืขืš. ืžื™ืจ ื”ืึธื‘ืŸ ืฆื•ื’ืขื’ืจื™ื™ื˜ ืึท ืคึผืจืึธื‘ืข ืคึผืœืึทื˜ืคืึธืจืžืข ืžื™ื˜ ืึทืŸ ื™ื™ื“ืขื ื™ืงืึทืœ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ืŸ ื’ืขืคืจื•ืื•ื•ื˜ ืฆื• ืจืขืคึผืจืึธื“ื•ืฆื™ืจืŸ ื“ืขื ืคึผืจืึธื‘ืœืขื ื“ื•ืจืš ืœื•ื™ืคืŸ ืคื™ืึธ ืื•ื™ืฃ bcache, ืคึผื™ืจื™ืึทื“ื™ืงืœื™ ืœื•ื™ืคืŸ udevadm ืฆื™ื ื’ืœ ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ื™ื•ืขื•ื•ืขื ื˜.

ืฉืจื™ื™ื‘ืŸ ื‘ืงืง-ื‘ืื–ื™ืจื˜ ืžื›ืฉื™ืจื™ื

ืœืึธืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืึท ืคึผืฉื•ื˜ ื ื•ืฆืŸ ืฆื• ืฉืคึผื•ืจ ืื•ืŸ ื•ื•ื™ื™ึทื–ืŸ ื“ื™ ืกืœืึธื•ืึทืกื˜ ืงืึทืœืœืก 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, ืžื™ื˜ ืฉืœื™ืกืœ ื˜ื™ืคึผ ื•ืงืกื ื•ืžืงืก ืื•ืŸ ืึท ื•ื•ืขืจื˜ ืคื•ืŸ ื˜ื™ืคึผ ืกื˜ืจื•ืงื˜ื•ืจ ื“ืึทื˜ืึท_ื˜. ื“ืขืจ ื˜ื™ืฉ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืืจืขื›ื˜ื™ื’ื˜ ืื™ืŸ ื“ืขื ืงืึธื ื˜ืขืงืกื˜ ืคื•ืŸ ืื•ื ื“ื–ืขืจ 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(). ื ืึธืš ื“ืขื, ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ื™ PID ืคื•ืŸ ื“ืขื ืคึผืจืึธืฆืขืก ืื™ืŸ ื“ืขื ืงืึธื ื˜ืขืงืกื˜ ืคื•ืŸ ื•ื•ืึธืก ืžื™ืจ ืึทืจื‘ืขื˜ืŸ, ืื•ืŸ ื“ื™ ืงืจืึทื ื˜ ืฆื™ื™ื˜ ืกื˜ืึทืžืคึผ ืื™ืŸ ื ืึทื ืึธืกืขืงืึธื ื“ืก. ืžื™ืจ ืฉืจื™ื™ึทื‘ืŸ ืขืก ืึทืœืข ืึทืจืึธืคึผ ืื™ืŸ ืึท ืคืจื™ืฉ ืื•ื™ืกื’ืขืงืœื™ื‘ืŸ ืกื˜ืจื•ืงื˜ื•ืจ ื“ืึทื˜ืึท_ื˜ ื“ืึทื˜ืŸ. ืžื™ืจ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ื“ื™ืกืง ื ืึธืžืขืŸ ืคื•ืŸ ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ื‘ื™ืึธ, ืฐื ืก ืฐืขืจ ื˜ ื“ื•ืจื›ื’ืขืคื™ืจ ื˜ ื‘ืฒ ื ืจื•ืคืŸ 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.

ืื™ืŸ ื“ื™ ืคึผื™ื˜ื”ืึธืŸ ืฉืจื™ืคื˜ ื•ื•ืึธืก ื•ื•ืขื˜ ืœืึธื“ืŸ ื“ืขื ืงืึธื“, ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืคืึทืจื‘ื™ื™ึทื˜ืŸ 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")

ืžื™ืจ ื•ื•ืขืœืŸ ืื•ื™ืš ื”ืึธื‘ืŸ ืฆื• ื‘ืึทืฉืœื™ืกืŸ ืกื˜ืจื•ืงื˜ื•ืจ ื“ืึทื˜ืึท_ื˜ ืื™ืŸ ืื•ื ื“ื–ืขืจ ืฉืจื™ืคื˜, ืึทื ื“ืขืจืฉ ืžื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ืœื™ื™ืขื ืขืŸ ืขืคึผืขืก:

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. ืœืึธืžื™ืจ ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ืœื•ื™ืคืŸ ืขืก ืื•ื™ืฃ ืึท ืคึผืจืึธื‘ืข ืคึผืœืึทื˜ืคืึธืจืžืข ื•ื•ื• ืคื™ืึธ ืื™ื– ืคืœื™ืกื ื“ื™ืง, ืฉืจื™ื™ื‘ืŸ ืฆื• bcache, ืื•ืŸ ืจื•ืคืŸ udevadm ืžืึธื ื™ื˜ืึธืจ:

ืคึฟื•ืŸ ื”ื•ื™ืš ืกืขืฃ ืœืึทื˜ืึทื ืกื™ ืฆื• ืงืขืจื ืขืœ ืคึผืึทื˜ืฉ ื ื™ืฆืŸ eBPF / BCC
ืฆื•ื ืกื•ืฃ! ืื™ืฆื˜ ืžื™ืจ ื–ืขืŸ ืึทื– ื•ื•ืึธืก ื’ืขืงื•ืงื˜ ื•ื•ื™ ืึท ืกื˜ืึธืœื™ื ื’ ื‘ืงืึทื˜ืฉืข ืžื™ื˜ืœ ืื™ื– ืคืืงื˜ื™ืฉ ืึท ืกื˜ืึธืœื™ื ื’ ืจื•ืคืŸ generic_make_request() ืคึฟืึทืจ ืึท ืงืึทืฉื˜ ื“ื™ืกืง.

ื’ืจืึธื‘ืŸ ืื™ืŸ ื“ื™ ืงืขืจื ืขืœ

ื•ื•ืึธืก ืคึผื•ื ืงื˜ ืกืœืึธื•ื™ื ื’ ืึทืจืึธืคึผ ื‘ืขืฉืึทืก ื‘ืขื˜ืŸ ื˜ืจืึทื ืกืžื™ืกื™ืข? ืžื™ืจ ื–ืขืŸ ืึทื– ื“ื™ ืคืึทืจื”ืึทืœื˜ืŸ ืึทืงืขืจื– ืืคื™ืœื• ืื™ื™ื“ืขืจ ื“ื™ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื‘ืขื˜ืŸ ืึทืงืึทื•ื ื˜ื™ื ื’, ื“.ื”. ืึทืงืึทื•ื ื˜ื™ื ื’ ืคื•ืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ื‘ืขื˜ืŸ ืคึฟืึทืจ ื•ื•ื™ื™ึทื˜ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืคื•ืŸ ืกื˜ืึทื˜ื™ืกื˜ื™ืง ืื•ื™ืฃ ืขืก (/proc/diskstats ืึธื“ืขืจ 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 ืฆื™ื ื’ืœ ื‘ืึทืคึฟืขืœ ื– ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟืึทืจ ื“ื™ ื‘ืœืึธืง ืžื™ื˜ืœ ืฆื• ื–ื™ื™ืŸ ื’ืขื•ื•ืขื ื“ื˜. ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก ื–ืขื ืขืŸ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ื™ ื•ื“ืขื•ื• ื›ึผืœืœื™ื. ืžื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ื•ื•ืึธืก ืกืขื˜ื˜ื™ื ื’ืก ืคืจื™ื™ื– ื“ื™ ืจื™ื™ ื“ื•ืจืš ื˜ืจื™ื™ื ื’ ืฆื• ื˜ื•ื™ืฉืŸ ื–ื™ื™ ื“ื•ืจืš 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]

ื•ื“ืขื•ื• ื›ึผืœืœื™ื ื˜ื•ื™ืฉืŸ ื’ืึทื ืฅ ืจืึทืจืขืœื™ ืื•ืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื“ืึธืก ื›ืึทืคึผืึทื ื– ืื™ืŸ ืึท ืงืึทื ื˜ืจืึธื•ืœื“ ืฉื˜ื™ื™ื’ืขืจ. ืึทื–ื•ื™ ืžื™ืจ ื–ืขืŸ ืึทื– ืืคื™ืœื• ืึทืคึผืœื™ื™ื™ื ื’ ื“ื™ ืฉื•ื™ืŸ ื‘ืึทืฉื˜ื™ืžื˜ ื•ื•ืึทืœื•ืขืก ื– ืึท ืคืึทืจื’ืจืขืกืขืจืŸ ืื™ืŸ ื“ื™ ืคืึทืจื”ืึทืœื˜ืŸ ืื™ืŸ ื˜ืจืึทื ืกืคืขืจื™ื ื’ ื“ื™ ื‘ืงืฉื” ืคื•ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื• ื“ื™ ื“ื™ืกืง. ืคื•ืŸ ืงื•ืจืก, ื“ื–ืฉืขื ืขืจื™ื™ื˜ื™ื ื’ ื•ื“ืขื•ื• ื’ืขืฉืขืขื ื™ืฉืŸ ื•ื•ืขืŸ ืขืก ื–ืขื ืขืŸ ืงื™ื™ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื“ื™ ื“ื™ืกืง ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ (ืœืžืฉืœ, ื“ื™ ืžื™ื˜ืœ ืื™ื– ื ื™ืฉื˜ ืžืึธื•ื ื˜ืขื“ / ื“ื™ืกืงืึทื ืขืงื˜ื™ื“) ืื™ื– ื ื™ืฉื˜ ืึท ื’ื•ื˜ ืคื™ืจ. ืึธื‘ืขืจ, ืžื™ืจ ืงืขื ืขืŸ ื”ืขืœืคึฟืŸ ื“ื™ ืงืขืจืŸ ื ื™ืฉื˜ ื˜ืึธืŸ ื•ืžื ื™ื™ื˜ื™ืง ืึทืจื‘ืขื˜ ืื•ืŸ ืคืจื™ืจืŸ ื“ื™ ื‘ืขื˜ืŸ ืจื™ื™ ืื•ื™ื‘ ืขืก ืื™ื– ื ื™ื˜ ื ื™ื™ื˜ื™ืง. ื“ืจื™ื™ึท ืงืœื™ื™ืŸ ื˜ื•ืขืŸ ืจื™ื›ื˜ื™ืง ื“ื™ ืกื™ื˜ื•ืึทืฆื™ืข.

ืกืึธืฃ

eBPF ืื™ื– ืึท ื–ื™ื™ืขืจ ืคืœืขืงืกืึทื‘ืึทืœ ืื•ืŸ ืฉื˜ืึทืจืง ื’ืขืฆื™ื™ึทื’. ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ื’ืขืงื•ืงื˜ ืื•ื™ืฃ ืื™ื™ืŸ ืคึผืจืึทืงื˜ื™ืฉ ืคืึทืœ ืื•ืŸ ื“ืขืžืึทื ืกื˜ืจื™ื™ื˜ื™ื“ ืึท ืงืœื™ื™ืŸ ื˜ื™ื™ืœ ืคื•ืŸ ื•ื•ืึธืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขื˜ืืŸ. ืื•ื™ื‘ ืื™ืจ ื–ืขื ื˜ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื“ืขื•ื•ืขืœืึธืคึผื™ื ื’ BCC ื™ื•ื˜ื™ืœืึทื˜ื™ื–, ืขืก ืื™ื– ื•ื•ืขืจื˜ ืึท ืงื•ืง ืื™ืŸ ื‘ืึทืึทืžื˜ืขืจ ื˜ื•ื˜ืึธืจื™ืึทืœ, ื•ื•ืึธืก ื‘ืืฉืจื™ื™ื‘ื˜ ื“ื™ ื‘ืึทืกื™ืงืก ื’ืขื–ื•ื ื˜.

ืขืก ื–ืขื ืขืŸ ืื ื“ืขืจืข ื˜ืฉื™ืงืึทื•ื•ืข ื“ื™ื‘ืึทื’ื™ื ื’ ืื•ืŸ ืคึผืจืึธืคื™ืœื™ื ื’ ืžื›ืฉื™ืจื™ื ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ eBPF. ืื™ื™ื ืขืจ ืคื•ืŸ ื–ื™ื™ - bpftrace, ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ืฉื˜ืึทืจืง ืื™ื™ืŸ-ืœื™ื™ื ืขืจื– ืื•ืŸ ืงืœื™ื™ืŸ ืžื’ื™ืœื” ืื™ืŸ ืึท ื•ืžื’ืขืœื•ืžืคึผืขืจื˜ ืฉืคึผืจืึทืš. ืืŸ ืื ื“ืขืจ - ebpf_exporter, ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื–ืึทืžืœืขืŸ ื ื™ื“ืขืจื™ืง-ืžื“ืจื’ื”, ื”ื•ื™ืš-ื”ืึทื›ืœืึธื˜ืข ืžืขื˜ืจื™ืงืก ื’ืœื™ื™ึทืš ืื™ืŸ ื“ื™ื™ืŸ ืคึผืจืึธืžืขื˜ื”ืขื•ืก ืกืขืจื•ื•ืขืจ, ืžื™ื˜ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ืฉืคึผืขื˜ืขืจ ื‘ืึทืงื•ืžืขืŸ ืฉื™ื™ืŸ ื•ื•ื™ื–ืฉื•ื•ืึทืœืึทื–ื™ื™ืฉืึทื ื– ืื•ืŸ ืืคื™ืœื• ืึทืœืขืจืฅ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’