рдЙрдЪреНрдЪ рд╕реАрдПрдлрдПрдЪ рд▓реЗрдЯреЗрдВрд╕реА рд╕реЗ рдХрд░реНрдиреЗрд▓ рдкреИрдЪ рдХреЗ рд╕рд╛рде рдИрдЖрд░рдкреАрдПрдл / рдмреАрд╕реАрд╕реА



рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдФрд░ рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдкрдХрд░рдг рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, eBPF рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдпрд╛ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛, рдХрдо рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рдХрд░реНрдиреЗрд▓ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЕрдм рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯреВрд▓ рд╣реИрдВ рдЬреЛ рдХрд┐ eBPF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдкрд╛рдпрдердирдмреАрд╕реАрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдЯреВрд▓ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВред рдпрд╣ рд▓реЗрдЦ рдЙрддреНрдкрд╛рджрди рдХреЗ рдорд╛рд╣реМрд▓ рд╕реЗ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореБрджреНрджреЗ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╣рдо рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓реЗрдВрдЧреЗ рдФрд░ рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореМрдЬреВрджрд╛ рдмреАрд╕реАрд╕реА рдЙрдкрдХрд░рдг рдХреИрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рд┐рдл рдзреАрдореА рд╣реИ


Ceph рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдВрдмрддрд╛ рдЕрдиреНрдп рд╕рд░реНрд╡рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдереАред



рдЗрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рдПрдХ рдирдпрд╛ рдХреИрд╢рд┐рдВрдЧ рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рд╣реИ - bcache, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдордиреЗ рдЗрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдкрд╣рд▓реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ - рдФрд░ рдПрдХ рдирдпрд╛ рдХрд░реНрдиреЗрд▓ - 4.15, рдЬреЛ рдЕрднреА рднреА рдЗрд╕ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдХрд╣реАрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдП рдЧрд╣рд░рд╛рдИ рд╕реЗ рджреЗрдЦреЗрдВред

рдореЗрдЬрд╝рдмрд╛рди рдХреА рдЬрд╛рдБрдЪ


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕реАрдл-рдУрдПрд╕рдбреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╣рдо рд▓реМ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░реЗрд╕рд┐рдВрдЧ рдЯреВрд▓ perf рдФрд░ flamescope рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:



рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдлреНрд▓реЗрдореЛрдЧреНрд░рд╛рдл рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, fdatasync () рдиреЗ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬреИрд╡ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреА рдЬрдбрд╝ рд╕реЗрдл рдбреЗрдореЙрди рдХреЗ рдмрд╛рд╣рд░ рдХрд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдХрд░реНрдиреЗрд▓, bcache рдпрд╛ рдбрд┐рд╕реНрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред Iostat рдЖрдЙрдЯрдкреБрдЯ рдиреЗ bcache рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рджрд┐рдЦрд╛рдИред

рдПрдХ рдФрд░ рд╕рдВрджреЗрд╣рд╛рд╕реНрдкрдж рдЦреЛрдЬ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо-рдпреВрдбрд╡реНрдб рдбреЗрдореЙрди рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ; рдХрдИ CPU рдкрд░ 20%ред рдпрд╣ рдЕрдЬреАрдм рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЪреВрдВрдХрд┐ systemd-udevd uevents рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЛрдИ uevents рд╣реИрдВ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП udvadm рдореЙрдирд┐рдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ "рдкрд░рд┐рд╡рд░реНрддрди" uevents рдЙрддреНрдкрдиреНрди рд╣реЛ рд░рд╣реЗ рдереЗред

рдпрд╣ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЗрди рд╕рднреА uevents рдХреЛ рдХреНрдпрд╛ рднреЗрдЬрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдмреАрд╕реАрд╕реА рдЯреВрд▓рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ, рдХрд░реНрдиреЗрд▓ (рдФрд░ рд╕реЗрдл рдбреЗрдорди) рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рд░реЗрдХреНрд╕реНрдЯ () рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдЪрд▓реЛ рдмреАрд╕реАрд╕реА рдЯреВрд▓рдХрд┐рдЯ рд╕реЗ рдлрдВрдЧрд▓рд╕рд┐рдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреА рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВ , рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдо рд╕рд╣реА рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИрдВред рд╣рдо 1 рд╕реЗрдХрдВрдб рдХреЗ рдЕрдВрддрд░рд╛рд▓ (-i) рдореЗрдВ ceph рдбреЗрдорди рдХреЗ PID (-p рддрд░реНрдХ) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдФрд░ рдорд┐рд▓реАрд╕реЗрдХрдВрдб (-m) рдореЗрдВ рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВрдЧреЗред



рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдбрд┐рд╡рд╛рдЗрд╕ рдЪрд╛рд▓рдХ рдХреА рдХрддрд╛рд░ рдореЗрдВ рдЬреИрд╡ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред

Bcache рдПрдХ рдЬрдЯрд┐рд▓ рдЙрдкрдХрд░рдг рд╣реИ; рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдореЗрдВ 3 рдбрд┐рд╡рд╛рдЗрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдПрдХ рдмреИрдХрд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕, рдЬреЛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдзреАрдореА рдЧрддрд┐ рд╕реЗ HDD рд╣реИ; рдПрдХ рдХреИрд╢рд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕, рдЬреЛ NVMe рдбреНрд░рд╛рдЗрд╡ рдХрд╛ рд╡рд┐рднрд╛рдЬрди рд╣реИ; рдФрд░ рдПрдХ bcache рд╡рд░реНрдЪреБрдЕрд▓ рдбрд┐рд╡рд╛рдЗрд╕, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдмрдорд┐рд╢рди рдзреАрдорд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП? рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред

рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ uevents ceph daemons рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ uevents рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рдвреВрдВрдврдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ uevents рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕рдордп-рд╕рдордп рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХреНрдпрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд╣рдо рдмреАрд╕реАрд╕реА рдЯреВрд▓рдХрд┐рдЯ рд╕реЗ рдПрдЧреНрдЬрд╝рд╛рдирд╕реНрдкреЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдлрд╛рдЗрд▓ рдореЗрдВ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

/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 рд╣реИред рд╣рдордиреЗ рдЪреЗрдХ рдХрд┐рдпрд╛ рдХрд┐ 5802 рдХреНрдпрд╛ рдерд╛ рдФрд░ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдореЙрдиреАрдЯрд░рд┐рдВрдЧ рдбреЗрдорди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдПрдХ рджреЛрд╖рдкреВрд░реНрдг рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓рд╛ред рдПрдЪрдмреАрдП рддрд╛рдкрдорд╛рди рдХреЛ рд╣рд░ 30 рд╕реЗрдХрдВрдб рдореЗрдВ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЪреЗрдХ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рдореВрд▓реНрдп рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реАрдПрдлрдПрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рдиреЗ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдпрд╛ред

рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ bcache рд╡рд┐рд▓рдВрдмрддрд╛ рдЕрдзрд┐рдХ рдХреНрдпреЛрдВ рдереАред рд╣рдордиреЗ рдПрдХ рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ udvadm рдЯреНрд░рд┐рдЧрд░ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде udev рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реБрдП bcache рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ fio рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ред

рд▓реЗрдЦрди BCC- рдЖрдзрд╛рд░рд┐рдд рдЙрдкрдХрд░рдг


рд╣рдо рдпрд╣рд╛рдВ рдЬреЛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рд╕рд░рд▓ рдЯреВрд▓ рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рдзреАрдореА рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ () рдХреЙрд▓ рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдбрд┐рд╕реНрдХ рдХрд╛ рдирд╛рдо рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдпреЛрдЬрдирд╛ рд╕рд░рд▓ рд╣реИ:

  • рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ () рдкрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ
    • рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рд╕реЗ рдЙрдкрд▓рдмреНрдз рдбрд┐рд╕реНрдХ рдирд╛рдо рдХреЛ рд╕рд╣реЗрдЬреЗрдВ
    • рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕рд╣реЗрдЬреЗрдВ
  • рдЬреЗрдирд░рд┐рдХ_рдореЗрдХ_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ () рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдкрд░ рдХреНрд░реЗрдЯрдкреНрд░реЛрдм рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ:
    • рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
    • рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкреНрд╕ рджреЗрдЦреЗрдВ рдФрд░ рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЯ рд╕реЗ рдХрд░реЗрдВ
    • рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдереНрд░реЗрд╢реЛрд▓реНрдб рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рдбрд┐рд╕реНрдХ рдирд╛рдореЛрдВ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ

Kprobes рдФрд░ kretprobes рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдФрд░ рд╕рд╛рде рд╣реА рдЗрд╕ рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╡рд┐рднрд┐рдиреНрди BCC рдЯреВрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрди рд╕рднреА рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рд╣реИред рд╣рдо рддрд░реНрдХ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рд╣реА рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред

рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкрд╛рда рдХреЛ рдЕрдЬрдЧрд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 bpf_text = тАЬтАЭтАЭ # Here will be the bpf program code тАЬтАЭтАЭ 

BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрд╢рдореИрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдФрд░ рд╕реНрд╡-рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреАрдЖрдИрдбреА тАЛтАЛрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

 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); 

рдпрд╣рд╛рдБ рд╣рдо рдПрдХ U64 рдХреБрдВрдЬреА рдкреНрд░рдХрд╛рд░ рдФрд░ рдПрдХ рдбреЗрдЯрд╛ data_t рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реИрд╢рдореИрдк p рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдирдХреНрд╢рд╛ рд╣рдорд╛рд░реЗ рдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрджрд░реНрдн рд╕реЗ рд╕реБрд▓рдн рд╣реИред BPF_PERF_OUTPUT рдореИрдХреНрд░реЛ рдИрд╡реЗрдВрдЯ рдирд╛рдордХ рдПрдХ рдЕрдиреНрдп рдорд╛рдирдЪрд┐рддреНрд░ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдбреЗрдЯрд╛ рдкреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдФрд░ рдЙрд╕рдХреА рд╡рд╛рдкрд╕реА рдХреЗ рдмреАрдЪ рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рдмреАрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЛ рдорд╛рдкрддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдмрд╛рдж рдореЗрдВ рдЙрд╕реА рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░рд┐рдЯрд░реНрди рдХреЗ рдмреАрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдмрд╛рдпреЛрд▓реИрдЯреЗрдВрд╕реА рдЯреВрд▓, рдЬрд╣рд╛рдВ рдкреЙрдЗрдВрдЯрд░ рдЯреВ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реИрд╢рдо рдХреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдПрдХ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдПрдХ kprobe рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 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); } 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓рд╛ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХреЗ_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ () рддрд░реНрдХ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╣реИред рдлрд┐рд░ рд╣рдо рдиреИрдиреЛ-рд╕реЗрдХрдВрдб рдореЗрдВ рдкреАрдЖрдИрдбреА тАЛтАЛрдФрд░ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдирдП рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдбреЗрдЯрд╛_рдЯреА рдбреЗрдЯрд╛ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ ред рд╣рдореЗрдВ рдЬреИрд╡ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдбрд┐рд╕реНрдХ рдХрд╛ рдирд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ () рдореЗрдВ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рд╣реЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдЪрд░рдг рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рд╣реИрд╢рдорд╛рдк рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝рдирд╛ рд╣реИред

рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХ_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ () рд░рд┐рдЯрд░реНрди рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 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 рд╣рдореЗрдВ рдереНрд░реЗрдб рдЧреНрд░реБрдк id рджреЗрддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ bpf_get_current_pid_tgid () рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рди 64-рдмрд┐рдЯ рдорд╛рди рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдереНрд░реЗрдб GID рдФрд░ PID рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рд╣рдореЗрдВ рд╣рд░ рдереНрд░реЗрдб рдЖрдИрдбреА рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдореБрдЦреНрдп рдереНрд░реЗрдб рдХреЗ PID рдХреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╡рд┐рд▓рдВрдмрддрд╛ рджрд╣рд▓реАрдЬ рд╕реЗ рдКрдкрд░ рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЗрд╡реЗрдВрдЯ рдореИрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпреВрдЬрд░рд╕реНрдкреЗрд╕ рдореЗрдВ рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЕрдВрдд рдореЗрдВ рд╣реИрд╢рдорд╛рдк рдПрдВрдЯреНрд░реА рдХреЛ рд╣рдЯрд╛ рджреЗрдВред

рд╣рдорд╛рд░реА рдкрд╛рдЗрдерди рд▓рд┐рдкрд┐ рдореЗрдВ, рд╣рдореЗрдВ рдЙрд╕ рд╕реАрдорд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ 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") 

BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣рдореЗрдВ рдЕрдкрдиреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЙрд╕реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдбреЗрдЯрд╛ 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 рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЪрд▓реЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ udev рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрдмрдХрд┐ fio рдПрдХ bcache рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:



рд╕рдлрд▓рддрд╛! рдЕрдм рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ bcache рдХреЗ рд▓рд┐рдП рдЙрдЪреНрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рдЬреИрд╕рд╛ рдЬреЛ рджрд┐рдЦрддрд╛ рдерд╛, рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рдмреИрдХрд┐рдВрдЧ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп-рд╕реЗрдХрдВрдб (request) рд╣реИред

рдЧрд┐рд░реА рдореЗрдВ рдЦреЛрджреЛ


рдЕрдиреБрд░реЛрдз рд╕рдмрдорд┐рдЯ рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдЦрд╛рддреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╡рд┐рд▓рдВрдмрддрд╛ рд╕реНрдкрд╛рдЗрдХ рднреА рд╣реБрдЖ рдерд╛ред рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЗ рджреМрд░рд╛рди рдпрд╛ рддреЛ рдмрд╛рдпреЛрд╕реИрдЯ рдпрд╛ рдмрд╛рдпреЛрд▓рд╛рдЯреЗрдВрд╕реА рдмреАрд╕реАрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЪрд▓рд╛рдХрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд╕реНрдЯрд╛рд░реНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рди рддреЛ рдЯреВрд▓ рдбрд┐рд╕реНрдХ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ред

рдпрджрд┐ рд╣рдо generic_make_request () рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ , рддреЛ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрдЦрд╛рдВрдХрди рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдХрд╛рд░реНрдп рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рд╣реИ рдЬреЗрдиреЗрд░рд┐рдХ_рдореЗрдХреЗ_рд░реЗрдХреНрд╡реЗрд╕реНрдЯ_рдЪреЗрдХ () , рдЬреЛ рдХрд┐ рд▓рд╛рдЗрдЯ рд╣реИ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЖрджрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╛рдпреЛ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ blk_queue_enter () рд╣реИ , рдЬрд┐рд╕рдореЗрдВ рдПрдХ wa_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 рд╣реИрдВ ред рд╡реЗ рдХрддрд╛рд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЙрдбрд╝рд╛рди рдореЗрдВ io рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм blk_mq_freeze_queue () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, q-> mq_freeze_depth рдХреЛ blk_freeze_queue_start () рдореЗрдВ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдХрд░реНрдиреЗрд▓ blk_mq_freeze_queue_wait () рдореЗрдВ рдХрддрд╛рд░ рдХреЗ рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рдбрд┐рд╕реНрдХ рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд░реНрдиреЗрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА io рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдЬрдм рдХрддрд╛рд░ рдЦрд╛рд▓реА рд╣реЛрддреА рд╣реИ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рдЪрд░рдг blk_mq_unfreeze_queue () рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ , рдЬреЛ рдлреНрд░реАрдЬ_рдбреЗрдк рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдШрдЯрд╛рддрд╛ рд╣реИ ред

рдЕрдм рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирддреЗ рд╣реИрдВред Udvadm рдЯреНрд░рд┐рдЧрд░ рдХрдорд╛рдВрдб рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рдЙрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ udv рдирд┐рдпрдореЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдХреНрдпреВрд╕реЗрдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрджрд▓рдХрд░ рдпрд╛ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрдХрд░ рдлреНрд░реАрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо BCC рдЯреВрд▓рдХрд┐рдЯ рд╕реЗ рдЯрдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдЯреИрдХ рдХреЛ рд╣рд░ blk_freeze_leue рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 ~# /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 рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЕрдХреНрд╕рд░ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рдорд╛рдиреЛрдВ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд┐рд▓рдВрдмрддрд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рд╕реНрдкрд╛рдЗрдХ рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдХреЛрдИ рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдВрд▓рдЧреНрди рдпрд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ) рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ udv рдИрд╡реЗрдВрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред рдлрд┐рд░ рднреА, рдпрджрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдХрд░реНрдиреЗрд▓ рдХреЛ рдХрддрд╛рд░ рдХреЛ рдЬрдордиреЗ рд╕реЗ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВред рддреАрди рдЫреЛрдЯреЗ-рдЫреЛрдЯреЗ рдореБрджреНрджреЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


eBPF рдЕрддреНрдпрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдорд╛рдорд▓реЗ рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдЬреЛ рдЗрд╕рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ рдЙрд╕рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдк BCC- рдЖрдзрд╛рд░рд┐рдд рдЯреВрд▓ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдП , рдЬреЛ рдЗрд╕рдХреА рдореВрд▓рднреВрдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рдИрдЬреАрдкреАрдПрдл-рдЖрдзрд╛рд░рд┐рдд рдЯреВрд▓ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ bpftrace рд╣реИ , рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрдЬреАрдм рддрд░рд╣ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдСрдирд▓рд┐рдирд░реНрд╕ рдФрд░ рдЫреЛрдЯреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рджреЗрддрд╛ рд╣реИред рдПрдХ рдФрд░ рдПрдХ рд╣реИ ebpf_exporter , рдЬреЛ рдЕрдкрдиреЗ рд╢рд╛рдирджрд╛рд░ рджреГрд╢реНрдп рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЙрдЪреНрдЪ-рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi450818/


All Articles