{"id":318058,"date":"2021-02-15T21:00:19","date_gmt":"2021-02-15T21:00:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=318058"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=318058","title":{"rendered":"\u041e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u043c \u044f\u0434\u0440\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 bpftrace"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u00abBPF \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445\u00bb (<a href=\"https:\/\/habr.com\/ru\/post\/493880\/\">0<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/514736\/\">1<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/529316\/\">2<\/a>) \u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 Linux \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u043d\u0435\u0435 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0438 \u044f\u0437\u044b\u043a\u0435 <code>bpftrace<\/code> \u2014 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u0438\u0440 BPF \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u0440\u043e BPF \u0440\u043e\u0432\u043d\u044b\u043c \u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 <code>bpftrace<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0438\u0445 \u043a \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u044f\u0434\u0440\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u041a\u041f\u0414\u0412 \u043d\u0438\u0436\u0435\u2026 \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u0432\u044b \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442\u0435 \u0442\u0440\u0435\u0439\u0441\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>bpftrace<\/code>!<\/p>\n<p>  <\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441\u0435\u0440\u0438\u0438, \u044d\u0442\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0438 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u044f\u0442\u0438 \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043e \u043b\u044e\u0431\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u0432 \u044f\u0434\u0440\u0435 Linux \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u0445 \u2014 <code>ply<\/code> \u0438 BCC. <s>\u041c\u0438\u043d\u0443\u0442\u044b \u0432\u043e \u0444\u0440\u0430\u0437\u0435 \u00ab\u043f\u043e\u0441\u043b\u0435 \u043f\u044f\u0442\u0438 \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f\u00bb \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0440\u043a\u0443\u0440\u0438\u0430\u043d\u0441\u043a\u0438\u0435. \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043f\u044f\u0442\u0438 \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/s><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-t\/t0\/nb\/-tt0nbuuleaiqi-j3uhtesdf6vq.png\" title=\"bpftrace magic\"><a name=\"habracut\"><\/a>  <\/p>\n<h1>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h1>\n<p>  <\/p>\n<ul>\n<li><a href=\"#getting-bpftrace\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 bpftrace<\/a><\/li>\n<li><a href=\"#events\">\u041a\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0440\u0435\u0439\u0441\u0438\u0442\u044c?<\/a><\/li>\n<li><a href=\"#tutorial\">Bpftrace: tutorial<\/a><br \/> \n<ul>\n<li><a href=\"#tutorial-base\">\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438<\/a><\/li>\n<li><a href=\"#tutorial-structure\"><code>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c bpftrace<\/code><\/a><\/li>\n<li><a href=\"#tutorial-vars\">\u0425\u0440\u0430\u043d\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043c\u0430\u043f\u044b<\/a><\/li>\n<li><a href=\"#tutorial-count\">\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0438 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/a><\/li>\n<li><a href=\"#tutorial-flame\">\u0412\u0435\u0441\u0435\u043b\u044b\u0435 \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438: flame graphs<\/a><\/li>\n<li><a href=\"#tutorial-end\">\u041f\u043e\u0440\u0430 \u0437\u0430\u043a\u0440\u0443\u0433\u043b\u044f\u0442\u044c\u0441\u044f<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#bcc\">BCC: \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/a><br \/> \n<ul>\n<li><a href=\"#new-bcc-tool\">\u041f\u0438\u0448\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 BCC<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a href=\"#ply\">Ply: bpftrace \u0434\u043b\u044f \u0431\u0435\u0434\u043d\u044b\u0445<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h1 id=\"getting-bpftrace\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 bpftrace<\/h1>\n<p>  <\/p>\n<p><b>\u041a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f.<\/b> \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>sudo apt install bpftrace<\/code> (\u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u0434 \u0432\u0430\u0448 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432). \u0415\u0441\u043b\u0438 <code>bpftrace<\/code> \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f, \u0442\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u0443.<\/p>\n<p>  <\/p>\n<p><b>\u0414\u043b\u0438\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f.<\/b> \u0425\u043e\u0442\u044f <code>bpftrace<\/code> \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u0445, \u043d\u043e \u043d\u0435 \u0432\u043e \u0432\u0441\u0435\u0445, \u0430 \u043a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d \u043a\u0440\u0438\u0432\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0435\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 BTF. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0434\u043e\u0431\u044b\u0442\u044c <code>bpftrace<\/code> \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 master-\u0432\u0435\u0442\u043a\u0438 <a href=\"https:\/\/github.com\/iovisor\/bpftrace\" rel=\"nofollow noopener noreferrer\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f bpftrace<\/a> \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 docker image \u0441 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0432\u043d\u0443\u0442\u0440\u0438 <code>bpftrace<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ docker pull quay.io\/iovisor\/bpftrace:latest $ cd \/tmp $ docker run -v $(pwd):\/o quay.io\/iovisor\/bpftrace:latest \/bin\/bash -c &quot;cp \/usr\/bin\/bpftrace \/o&quot; $ sudo .\/bpftrace -V bpftrace v0.11.4<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 bpftrace \u0440\u0443\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u0442\u0430\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e <code>glibc<\/code>, \u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u0440\u0443\u0433\u043e\u0439 <a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/INSTALL.md#copying-bpftrace-binary-from-docker\" rel=\"nofollow noopener noreferrer\"><code>docker image \u0441\u043e \u0441\u0442\u0430\u0440\u043e\u0439 glibc<\/code><\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u041a\u041f\u0414\u0412, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0439\u0441\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 <code>execve(2)<\/code> \u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0438 \u043a\u0435\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ sudo .\/bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf(&quot;%s -&gt; %s\\n&quot;, comm, str(uptr(args-&gt;filename))); }' Attaching 1 probe... bash -&gt; \/bin\/echo bash -&gt; \/usr\/bin\/ls gnome-shell -&gt; \/bin\/sh sh -&gt; \/home\/aspsk\/bin\/geeqie sh -&gt; \/usr\/local\/sbin\/geeqie ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ sudo mv \/tmp\/bpftrace \/usr\/local\/bin<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u043b\u043e, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a, \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u044f\u0434\u0440\u043e \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 BTF, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u043e\u044e \u0432\u0435\u0440\u0441\u0438\u044e <code>bpftrace<\/code>, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 docker \u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 <code>bpftrace<\/code> \u0441\u043c. <a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/INSTALL.md#building-bpftrace\" rel=\"nofollow noopener noreferrer\">\u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>  <\/p>\n<p><b>\u0412\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c.<\/b> \u0415\u0441\u043b\u0438 <code>bpftrace<\/code> \u0438\/\u0438\u043b\u0438 \u044f\u0434\u0440\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043e \u0431\u0435\u0437 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 BTF, \u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c kernel headers. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 <code>bpftrace<\/code> \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043e\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 <a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/INSTALL.md#kernel-headers-install\" rel=\"nofollow noopener noreferrer\">\u0440\u0435\u0446\u0435\u043f\u0442<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e BTF, \u0441\u043a\u0430\u0436\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e BTF \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 kernel headers, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f. \u0415\u0441\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0442 \u0432\u0430\u0441 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f BTF \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u0442\u043e \u043d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 <a href=\"http:\/\/www.brendangregg.com\/blog\/2020-11-04\/bpf-co-re-btf-libbpf.html\" rel=\"nofollow noopener noreferrer\">\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438<\/a> \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435 <a href=\"https:\/\/facebookmicrosites.github.io\/bpf\/blog\/2018\/11\/14\/btf-enhancement.html\" rel=\"nofollow noopener noreferrer\">\u044d\u0442\u043e\u0439<\/a> \u0438 <a href=\"https:\/\/facebookmicrosites.github.io\/bpf\/blog\/2020\/02\/19\/bpf-portability-and-co-re.html\" rel=\"nofollow noopener noreferrer\">\u044d\u0442\u043e\u0439<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"events\">\u041a\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0442\u0440\u0435\u0439\u0441\u0438\u0442\u044c?<\/h1>\n<p>  <\/p>\n<p>\u0412\u044b \u0441\u0438\u0434\u0438\u0442\u0435 \u0432 \u043b\u0435\u0441\u0443 \u0441 \u0444\u043e\u0442\u043e\u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043e\u043c \u043d\u0430 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043d\u043e\u043c \u0441\u0442\u0443\u043b\u0435. \u0418\u0434\u0435\u0442 \u043c\u0435\u043b\u043a\u0438\u0439 \u0434\u043e\u0436\u0434\u044c, \u043d\u043e \u043e\u043d \u0432\u0430\u043c \u043d\u0435 \u0441\u0442\u0440\u0430\u0448\u0435\u043d, \u0432\u0435\u0434\u044c \u0448\u0430\u043b\u0430\u0448 \u0438\u0437 \u0435\u043b\u043e\u0432\u044b\u0445 \u0432\u0435\u0442\u043e\u043a \u043d\u0430\u0434\u0435\u0436\u043d\u043e \u0443\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u0441 \u043a\u0430\u043a \u043e\u0442 \u0434\u043e\u0436\u0434\u044f, \u0442\u0430\u043a \u0438 \u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u0432. \u0420\u044f\u0434\u043e\u043c \u0441\u0442\u043e\u0438\u0442 \u0442\u0435\u0440\u043c\u043e\u0441 \u0441 \u043f\u0443\u044d\u0440\u043e\u043c, \u0439\u043e\u0433\u0443\u0440\u0442 \u0438 \u043f\u043e\u0434\u043d\u043e\u0441 \u0441 \u043a\u043e\u043f\u0447\u0435\u043d\u044b\u043c\u0438 \u0441\u0435\u043b\u0435\u0434\u043a\u0430\u043c\u0438. \u041d\u043e \u0442\u0443\u0442 \u0432\u044b \u0432\u0434\u0440\u0443\u0433 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u0442\u0435\u0441\u044c: \u00ab\u0430 \u0437\u0430\u0447\u0435\u043c \u044f \u0441\u044e\u0434\u0430 \u043f\u0440\u0438\u0448\u0435\u043b \u0438 \u0447\u0442\u043e \u044f \u0431\u0443\u0434\u0443 \u0441\u043d\u0438\u043c\u0430\u0442\u044c?!\u00bb \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0435\u0442\u0435\u0441\u044c, \u043d\u0430 \u043b\u0438\u0446\u0435 \u043a\u0440\u0430\u0441\u043d\u0435\u0435\u0442 \u0441\u043b\u0435\u043f\u043e\u043a \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0430 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo apt install bpftrace The following NEW packages will be installed:   bpftrace Preparing to unpack ...\/bpftrace_0.11.0-1_amd64.deb ... Unpacking bpftrace (0.11.0-1) ... Setting up bpftrace (0.11.0-1) ... Processing triggers for man-db (2.9.3-2) ... $<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0442\u0430\u043a, <code>bpftrace<\/code> \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d. \u041a\u0430\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0438\u0445 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u044f\u0437\u044b\u043a\u0430 <code>bpftrace<\/code>. \u0412\u043e\u0442 \u0441\u043f\u043e\u0439\u043b\u0435\u0440-\u043e\u0433\u043b\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f: <a href=\"#events-begin-end\"><code>BEGIN<\/code>, <code>END<\/code><\/a><\/li>\n<li>\u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 kprobes: <a href=\"#events-kprobes\"><code>kprobe<\/code>, <code>kretprobe<\/code>, <code>uprobe<\/code>, <code>uretprobe<\/code><\/a><\/li>\n<li>\u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 BPF trampolines: <a href=\"#events-bpf-trampolines\"><code>kfunc<\/code>, <code>kretfunc<\/code><\/a><\/li>\n<li>\u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 tracepoints: <a href=\"#events-tracepoints\"><code>tracepoint<\/code><\/a><\/li>\n<li>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: <a href=\"#events-usdt\"><code>usdt<\/code><\/a><\/li>\n<li>\u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0435 perf: <a href=\"#events-perf\"><code>software<\/code>, <code>hardware<\/code>, <code>profile<\/code>, <code>interval<\/code>, <code>watchpoint<\/code><\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b, \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0434\u0438\u043d-\u0434\u0432\u0430 \u043f\u0443\u043d\u043a\u0442\u0430 \u043d\u0430 \u0432\u0430\u0448 \u0432\u044b\u0431\u043e\u0440, \u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a <a href=\"#tutorial\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u0443<\/a> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0441\u044e\u0434\u0430 \u0437\u0430 \u0441\u043f\u0440\u0430\u0432\u043a\u043e\u0439.<\/p>\n<p>  <\/p>\n<h3 id=\"events-begin-end\">Bpftrace: hello world<\/h3>\n<p>  <\/p>\n<p>\u042f\u0437\u044b\u043a <code>bpftrace<\/code> \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u044f\u0437\u044b\u043a\u043e\u043c <a href=\"https:\/\/www.gnu.org\/software\/gawk\/manual\/gawk.pdf\" rel=\"nofollow noopener noreferrer\">awk<\/a> \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, <code>BEGIN<\/code> \u0438 <code>END<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 <code>bpftrace<\/code>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u0412\u043e\u0442 \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'BEGIN { printf(&quot;Hello world!\\n&quot;); }' Attaching 1 probe... Hello world! ^C<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043b\u0430 <code>&quot;Hello world!&quot;<\/code>. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c <code>Ctrl-C<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 <code>bpftrace<\/code> \u2014 \u044d\u0442\u043e \u0435\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 <code>bpftrace<\/code> \u0438\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>exit<\/code>. \u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u044d\u0442\u043e, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 <code>END<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e '  BEGIN { printf(&quot;Hello world!\\n&quot;); exit(); }  END { printf(&quot;So long\\n&quot;); }  ' Attaching 2 probes... Hello world! So long<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"events-kprobes\">Kprobes \u2014 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u042f\u0434\u0440\u043e \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u043a\u0430\u043a \u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u044f\u0434\u0440\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c kprobes (<b>K<\/b>ernel <b>Probe<\/b> \u2014 \u044f\u0434\u0435\u0440\u043d\u044b\u0439 \u0437\u043e\u043d\u0434) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435, \u043f\u043e \u043d\u0430\u0447\u0430\u043b\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043a\u043e\u0434\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0435. \u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u043c, \u0432\u043e\u043e\u0431\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 <code>kprobes<\/code>, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438, \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c \u0432 \u043a\u043e\u043d\u0446\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0437 <em>\u0431\u0443\u0434\u0443\u0449\u0438\u0445<\/em> \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Linux \u0441 BPF.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u0438 \u043a\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>schedule<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ sudo bpftrace -e '     k:schedule { @[comm] = count(); }     i:s:2 { exit();}     END { print(@, 10); clear(@); } ' Attaching 3 probes... @[Timer]: 147 @[kworker\/u65:0]: 147 @[kworker\/7:1]: 153 @[kworker\/13:1]: 158 @[IPC I\/O Child]: 170 @[IPC I\/O Parent]: 172 @[kworker\/12:1]: 185 @[Web Content]: 229 @[Xorg]: 269 @[SCTP timer]: 1566<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0432\u044b\u0439\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044f <code>@<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u043d\u043e\u0433\u043e \u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0439\u0441\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u0435\u0439-\u043f\u0440\u043e\u0431? \u042d\u0442\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftrace -l 'k:*' | wc -l 61106<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044f\u0434\u0440\u0430. \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0440\u0435\u0448\u0438\u043b \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432 \u043a\u043e\u0434 \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u0442\u0440\u0435\u0439\u0441\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 kprobe, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0441\u0430\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c kprobes.<\/p>\n<p>  <\/p>\n<h4>kretprobes<\/h4>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 <code>kprobe<\/code> \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a <code>kretprobe<\/code>. \u0415\u0441\u043b\u0438 <code>kprobe<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0442\u043e <code>kretporobe<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 <a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/docs\/reference_guide.md#1-builtins\" rel=\"nofollow noopener noreferrer\">\u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/a> <code>retval<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0447\u0442\u043e \u043d\u0430 \u043e\u0442\u0440\u0435\u0437\u043a\u0435 \u0432 \u0434\u0432\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>vfs_write<\/code> \u043d\u0430 \u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 (\u0432 \u0432\u0438\u0434\u0435 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftrace -e 'kr:vfs_write { @ = hist(retval); } i:s:2 { exit(); }' Attaching 2 probes...  @: [1]                  606 |@@@@@@@@@@@@@@@@@@@@@@@@@                           | [2, 4)                 0 |                                                    | [4, 8)                 0 |                                                    | [8, 16)             1223 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [16, 32)               0 |                                                    | [32, 64)              25 |@                                                   |<\/code><\/pre>\n<p>  <\/p>\n<h4>uprobes \u0438 uretprobes<\/h4>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u044f\u0434\u0440\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 (\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443), \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0443\u044e \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0442\u0435\u0445 \u0436\u0435 <code>kprobes<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432 <code>bpftrace<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>uprobes<\/code> \u0438 <code>uretprobes<\/code> \u2014 \u0432\u044b\u0437\u043e\u0432 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0435\u0447\u0430\u0442\u0430\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0431\u0430\u0448\u0430 (\u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442\u0441\u044f UID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftrace -e 'uretprobe:\/bin\/bash:readline { printf(&quot;readline: [%d]: \\&quot;%s\\&quot;\\n&quot;, uid, str(uptr(retval))); }' Attaching 1 probe... readline: [1000]: &quot;echo &quot;hello habr&quot;&quot; readline: [0]: &quot;echo &quot;hello from root&quot;&quot; ^C<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"events-bpf-trampolines\">\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0430, \u0432\u0435\u0440\u0441\u0438\u044f 2<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b\u0445 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b\u0435\u0439 <code>CONFIG_DEBUG_INFO_BTF=y<\/code> \u0432 <abbr title=\"\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043c. `\/boot\/config-$(uname -r)`\">\u043a\u043e\u043d\u0444\u0438\u0433\u0435<\/abbr> \u044f\u0434\u0440\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0448\u0435\u0432\u044b\u0439, \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 kprobes, \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f\u0434\u0440\u0430, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 <a href=\"https:\/\/lwn.net\/Articles\/804937\/\" rel=\"nofollow noopener noreferrer\">bpf trampolines<\/a>. \u0422\u0430\u043a \u043a\u0430\u043a BTF \u0432 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u043d\u044b\u0445 \u044f\u0434\u0440\u0430\u0445 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d, \u044f \u043f\u0440\u043e \u044d\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e. \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/docs\/reference_guide.md#15-kfunckretfunc-kernel-functions-tracing\" rel=\"nofollow noopener noreferrer\">\u0441\u044e\u0434\u0430<\/a> \u0438\/\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<p>  <\/p>\n<h3 id=\"events-tracepoints\">Tracepoints \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u044f\u0434\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438, \u0442\u043e, \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0447\u0443\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u0435\u0435. \u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u044f\u0434\u0440\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c tracepoints \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u044f\u0434\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftrace -l 't:*'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0445 \u0441\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c <code>kprobes<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftrace -l 't:*' | wc -l 1782<\/code><\/pre>\n<p>  <\/p>\n<p>\u043d\u043e \u0441\u0430\u043c\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e tracepoints \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 API: \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e tracepoint, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438\u043b\u0438 \u0441\u0431\u043e\u0440\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0432 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442. \u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e <code>bpftrace<\/code> \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 tracepoint, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftrace -lv tracepoint:thermal:thermal_temperature tracepoint:thermal:thermal_temperature     __data_loc char[] thermal_zone;     int id;     int temp_prev;     int temp;<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <code>kprobe<\/code>, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d BTF, \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u044f\u0434\u0440\u0430, \u043f\u0440\u0438\u0447\u0435\u043c \u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435. \u0410 \u0441 BTF \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u043d\u0430 \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 <code>kprobes<\/code> \u0438 <code>kfuncs<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"events-usdt\">usdt \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/h3>\n<p>  <\/p>\n<p>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043f\u0438\u0445\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u0447\u0435\u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0441\u0442\u044f\u043d\u0443\u043b \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 <a href=\"https:\/\/lwn.net\/Articles\/753601\/\" rel=\"nofollow noopener noreferrer\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#include &lt;sys\/sdt.h&gt; #include &lt;sys\/time.h&gt; #include &lt;unistd.h&gt;  int main(int argc, char **argv) {     struct timeval tv;      for (;;) {         gettimeofday(&amp;tv, NULL);         DTRACE_PROBE1(test, probe, tv.tv_sec);         sleep(1);     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>test:probe<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>tv.tv_sec<\/code> \u2014 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445. \u0427\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>systemtap-sdt-dev<\/code> (\u0438\u043b\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430). \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ cc \/tmp\/test.c -o \/tmp\/test $ sudo bpftrace -l 'usdt:\/tmp\/test' usdt:\/tmp\/test:test:probe<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c <code>\/tmp\/test<\/code> \u0432 \u043e\u0434\u043d\u043e\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435, \u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u043a\u0430\u0436\u0435\u043c<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftrace -e 'usdt:\/tmp\/test:test:probe { printf(&quot;\u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f %u\\n&quot;, arg0); }' Attaching 1 probe... \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f 1612903991 \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f 1612903992 \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f 1612903993 \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f 1612903994 \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f 1612903995 ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <code>arg0<\/code> \u2014 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>tv.tv_sec<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0432 breakpoint.<\/p>\n<p>  <\/p>\n<h3 id=\"events-perf\">\u0421\u043e\u0431\u044b\u0442\u0438\u044f Perf<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 <code>bpftrace<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u044f\u0434\u0440\u0430 Perf. \u041c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0438\u043f\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 <code>bpftrace<\/code>:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>software<\/code>: \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438-\u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0444\u0442\u0432\u0435\u0440\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/li>\n<li><code>hardware<\/code>: \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0435 <abbr title=\"Performance Monitoring Counters\">PMCs<\/abbr><\/li>\n<li><code>interval<\/code>: \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435<\/li>\n<li><code>profile<\/code>: \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n<\/ul>\n<p>  <\/p>\n<h4>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0438\u043f\u0430 `software`<\/h4>\n<p>  <\/p>\n<p>\u0412 \u044f\u0434\u0440\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 perf, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0445 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -l 's:*' software:alignment-faults: software:bpf-output: software:context-switches: software:cpu-clock: software:cpu-migrations: software:dummy: software:emulation-faults: software:major-faults: software:minor-faults: software:page-faults: software:task-clock:<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u044d\u043c\u043f\u043b\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'software:cpu-migrations:10 { @[comm] = count(); }' Attaching 2 probes... ^C@[kworker\/u65:1]: 1 @[bpftrace]: 1 @[SCTP timer]: 2 @[Xorg]: 2<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0441\u044f\u0442\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e CPU \u0430 \u0434\u0440\u0443\u0433\u043e\u0439. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u044b\u0448\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f \u0432 <code>perf_event_open(2)<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>cpu-migrations<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u044d\u0442\u043e\u0439 man-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u043e\u0434 \u0438\u043c\u0435\u043d\u0435\u043c <code>PERF_COUNT_SW_CPU_MIGRATIONS<\/code>.<\/p>\n<p>  <\/p>\n<h4>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0438\u043f\u0430 `hardware`<\/h4>\n<p>  <\/p>\n<p>\u042f\u0434\u0440\u043e \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c hardware counters, \u0430 <code>bpftrace<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0448\u0430\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF. \u0422\u043e\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u044f\u0434\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">bpftrace -l 'h*' hardware:backend-stalls: hardware:branch-instructions: hardware:branch-misses: hardware:bus-cycles: hardware:cache-misses: hardware:cache-references: hardware:cpu-cycles: hardware:frontend-stalls: hardware:instructions: hardware:ref-cycles:<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0442\u043e \u043a\u0430\u043a \u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 (\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u0442\u043e\u0442\u044b\u0441\u044f\u0447\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0441\u043c. <code>PERF_COUNT_HW_BRANCH_MISSES<\/code>):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">bpftrace -e 'hardware:branch-misses:100000 { @[tid] = count(); }' Attaching 3 probes... @[1055]: 4 @[3078]: 4 @[1947]: 5 @[1066]: 6 @[2551]: 6 @[0]: 29<\/code><\/pre>\n<p>  <\/p>\n<h4>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0438\u043f\u0430 `interval` \u0438 `profile`<\/h4>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0438\u043f\u043e\u0432 <code>interval<\/code> \u0438 <code>profile<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c CPU, \u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u2014 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 CPU.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0449\u0435 \u0440\u0430\u0437, \u043d\u043e \u0447\u0443\u0442\u044c \u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0438\u043c \u0435\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo bpftrace -e '     kr:vfs_write { @ = hist(retval); }     interval:s:2 { print(@); clear(@); } '<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0432\u044b\u0445\u043e\u0434\u0443 \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0434\u0440\u0430 <code>vfs_write<\/code> \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432 \u043d\u0435\u0439 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432\u0441\u0435\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u0430 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>interval<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0435 \u0434\u0432\u0435 \u0441\u0435\u043a\u0443\u043d\u0434\u044b, \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0438 \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c <code>@<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 <code>profile<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e '   profile:hz:99 { @[kstack] = count(); }   i:s:10 { exit(); }   END { print(@,1); clear(@); } ' Attaching 3 probes... @[     cpuidle_enter_state+202     cpuidle_enter+46     call_cpuidle+35     do_idle+487     cpu_startup_entry+32     start_secondary+345     secondary_startup_64+182 ]: 14455<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>profile<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u044f\u0434\u0440\u0435 99 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443, \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 <code>exit()<\/code>, \u0430 \u0441\u0435\u043a\u0446\u0438\u044f <code>END<\/code> \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044f <code>@<\/code> \u2014 \u0441\u0430\u043c\u044b\u0439 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u044f\u0434\u0435\u0440\u043d\u044b\u0439 \u0441\u0442\u0435\u043a (\u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043c\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c, \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442).<\/p>\n<p>  <\/p>\n<h1 id=\"tutorial\">Bpftrace: tutorial<\/h1>\n<p>  <\/p>\n<h3 id=\"tutorial-base\">\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043d\u0430\u0432\u044b\u043a\u0438<\/h3>\n<p>  <\/p>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c <code>bpftrace<\/code> \u0431\u0435\u0437 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u0443\u044e \u0441\u043f\u0440\u0430\u0432\u043a\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>bpftrace<\/code>. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c <code>bpftrace<\/code> \u043e\u0442 \u0440\u0443\u0442\u0430. \u0414\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043f\u0440\u0430\u0432\u043a\u0438 \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u043d\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u2014 \u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u043d\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>-l<\/code>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443. (\u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435 \u044f\u0441\u043d\u043e, \u0442\u043e \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043f\u0440\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438.) \u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -l '*kill_all*' kprobe:rfkill_alloc kprobe:kill_all kprobe:btrfs_kill_all_delayed_nodes<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0438\u0449\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0440\u0435\u0434\u0438 <code>tracepoints<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -l 't:*kill*' tracepoint:cfg80211:rdev_rfkill_poll tracepoint:syscalls:sys_enter_kill tracepoint:syscalls:sys_exit_kill tracepoint:syscalls:sys_enter_tgkill tracepoint:syscalls:sys_exit_tgkill tracepoint:syscalls:sys_enter_tkill tracepoint:syscalls:sys_exit_tkill<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e <code>tracepoint:syscalls<\/code>, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0438\u0441\u044c, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e <code>bpftrace<\/code>. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>X<\/code> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u0432\u0435 \u0442\u043e\u0447\u043a\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">tracepoint:syscalls:sys_enter_X tracepoint:syscalls:sys_exit_X<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0438\u0433\u0440\u0430\u0435\u043c\u0441\u044f \u0441 \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/man7.org\/linux\/man-pages\/man2\/execve.2.html\" rel=\"nofollow noopener noreferrer\"><code>execve(2)<\/code><\/a>. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e <code>tracepoint<\/code> \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>-v<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -lv 't:s*:sys_*_execve' tracepoint:syscalls:sys_enter_execve     int __syscall_nr;     const char * filename;     const char *const * argv;     const char *const * envp; tracepoint:syscalls:sys_exit_execve     int __syscall_nr;     long ret;<\/code><\/pre>\n<p>  <\/p>\n<p>(\u0437\u0430\u043c\u0435\u0442\u044c\u0442\u0435 \u043a\u0430\u043a \u043b\u043e\u0432\u043a\u043e \u043c\u044b \u0434\u0432\u0430\u0436\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 <code>*<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c <code>syscalls<\/code> \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u0442\u044c <code>sys_enter_execve<\/code> \u0438 <code>sys_exit_execve<\/code> \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438). \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 <code>-lv<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>args<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e '     t:s*:sys_enter_execve { printf(&quot;ENTER: %s\\n&quot;, str(uptr(args-&gt;filename))); }     t:s*:sys_exit_execve { printf(&quot;EXIT: %s: %d\\n&quot;, comm, args-&gt;ret); } ' Attaching 2 probes... ENTER: \/bin\/ls EXIT: ls: 0 ENTER: \/bin\/lss EXIT: bash: -2<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043b\u0438\u0441\u0442\u0438\u043d\u0433 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043c\u044b \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 <code>args-&gt;filename<\/code>. \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u043d\u0430\u043c \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>str<\/code>, \u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f: \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u044d\u0442\u043e\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431 \u044d\u0442\u043e\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>uptr<\/code>. \u0421\u0430\u043c <code>bpftrace<\/code> \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0443\u0433\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043d\u043e \u043e\u043d \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0422\u0430\u043a\u0436\u0435, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u044b\u0437\u043e\u0432 <code>bpftrace -lv<\/code> \u043d\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c \u043e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.11\/fs\/exec.c#L2054-L2060\" rel=\"nofollow noopener noreferrer\">\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 execve<\/a> (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043a\u0432\u0430\u043b\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0438\u043f\u0430 <code>__user<\/code>).<\/p>\n<p>  <\/p>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>comm<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0438\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430. \u041a\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>args-&gt;ret<\/code>. \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u044d\u0442\u043e\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 &quot;\u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f&quot; \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0437\u0430\u043c\u0435\u043d\u0435 \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u043e\u0432\u044b\u043c. \u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043e\u043d-\u0442\u0430\u043a\u0438 \u0432\u0435\u0440\u043d\u0435\u0442\u0441\u044f, \u043a\u0430\u043a \u043c\u044b \u0438 \u043c\u043e\u0436\u0435\u043c \u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u0432\u044b\u0432\u043e\u0434\u0435 \u0432\u044b\u0448\u0435: \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b <code>\/bin\/ls<\/code> \u0438\u0437 \u0431\u0430\u0448\u0430 \u0438 <code>exec<\/code> \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0441\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438 \u0432\u0435\u0440\u043d\u0443\u043b 0 (\u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 <code>ls<\/code> \u043f\u0440\u044f\u043c\u043e \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043a\u043e\u0434\u0430 <code>\/bin\/ls<\/code>), \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 <code>\/bin\/lss<\/code> \u0438 <code>exec<\/code> \u0432\u0435\u0440\u043d\u0443\u043b <code>-2<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 <code>bash<\/code>.<\/p>\n<p>  <\/p>\n<p><b>\u0423\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435.<\/b> \u0412\u043e\u0437\u044c\u043c\u0438\u0442\u0435 \u0432\u0430\u0448 \u043b\u044e\u0431\u0438\u043c\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0438 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442. \u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/docs\/reference_guide.md#26-uptr-annotate-userspace-pointer\" rel=\"nofollow noopener noreferrer\"><code>uptr<\/code><\/a>, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  <\/p>\n<h3 id=\"tutorial-structure\">\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c `bpftrace`<\/h3>\n<p>  <\/p>\n<p>\u042f\u0437\u044b\u043a <code>bpftrace<\/code> \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0441\u044f \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u044f\u0437\u044b\u043a\u043e\u043c awk (\u0441\u043c. \u0442\u0430\u043a\u0436\u0435 \u0433\u043b\u0430\u0432\u0443 6 \u0432 \u043a\u043d\u0438\u0436\u043a\u0435 <a href=\"https:\/\/books.google.com\/books\/about\/The_AWK_Programming_Language.html?id=53ueQgAACAAJ\" rel=\"nofollow noopener noreferrer\"><code>The AWK Programming Language<\/code><\/a>) \u0438 \u0438\u043c\u0435\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u043b\u043e\u043a\u043e\u0432 \u0432\u0438\u0434\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">&lt;probe&gt; &lt;filter&gt; { &lt;action&gt; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'BEGIN { printf(&quot;Hello\\n&quot;) } END { printf(&quot;World\\n&quot;) }'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c <code>&lt;probe&gt;<\/code> \u2014 \u044d\u0442\u043e <code>BEGIN<\/code> \u0438 <code>END<\/code>, \u0430 <code>&lt;action&gt;<\/code> \u2014 \u044d\u0442\u043e <code>printf<\/code>. \u041f\u043e\u043b\u0435<br \/>  <code>&lt;filter&gt;<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439,<br \/>  \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'p:s:1 \/cpu == 0\/ { printf(&quot;\u041f\u0440\u0438\u0432\u0435\u0442 \u0441 CPU%d\\n&quot;, cpu); }' Attaching 1 probe... \u041f\u0440\u0438\u0432\u0435\u0442 \u0441 CPU0 \u041f\u0440\u0438\u0432\u0435\u0442 \u0441 CPU0 ^C<\/code><\/pre>\n<p>  <\/p>\n<p>\u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043d\u0430 CPU 0.<\/p>\n<p>  <\/p>\n<p><b>\u0423\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435.<\/b> \u0427\u0442\u043e \u0432\u044b\u0432\u0435\u0434\u0435\u0442 \u044d\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0435\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 <code>\/cpu == 0\/<\/code>?<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 <code>&lt;filter&gt;<\/code> \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>write<\/code> \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0443 \u0442\u0440\u0435\u0439\u0441\u043f\u043e\u0438\u043d\u0442\u043e\u0432 \u2014 <code>sys_enter_write<\/code> \u0438 <code>sys_exit_write<\/code> \u0438 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u0442\u0440\u0435\u0434\u0430\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># cat \/tmp\/write-times.bt t:syscalls:sys_enter_write {   @[tid] = nsecs }  t:syscalls:sys_exit_write \/@[tid]\/ {   @write[comm] = sum((nsecs - @[tid]) \/ 1000);   delete(@[tid]); }  END {   print(@write, 10);   clear(@write);   clear(@); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u043b\u0438\u043d\u043d\u0430\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0435\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace \/tmp\/write-times.bt<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438, <code>sys_enter_write<\/code>, \u043c\u044b \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>write<\/code> \u0432 \u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 <code>@<\/code>, \u043a\u043b\u044e\u0447\u043e\u043c \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0441\u043b\u0443\u0436\u0438\u0442 <abbr title=\"Thread ID\"><code>tid<\/code><\/abbr>.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438, <code>sys_exit_write<\/code>, \u043c\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 <code>\/@[tid]\/<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0441\u044f \u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0432\u0435\u0434\u044c \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u043e\u0442\u043e\u043a \u0431\u044b\u043b \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 <code>write<\/code>. \u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f (\u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445) \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c <code>@write<\/code> \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <code>@[tid]<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c <code>^C<\/code>, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u043a\u0446\u0438\u044f <code>END<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u043c \u0434\u0435\u0441\u044f\u0442\u044c \u0441\u0430\u043c\u044b\u0445 \u043f\u0440\u043e\u0436\u043e\u0440\u043b\u0438\u0432\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438 \u0447\u0438\u0441\u0442\u0438\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0438 <code>@write<\/code> \u0438 <code>@<\/code>, \u0447\u0442\u043e\u0431\u044b <code>bpftrace<\/code> \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u043b \u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435.<\/p>\n<p>  <\/p>\n<p><b>\u0423\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435.<\/b> \u0422\u0430\u043a \u0447\u0442\u043e \u0436\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 <code>\/@[tid]\/<\/code>?<\/p>\n<p>  <\/p>\n<h3 id=\"tutorial-vars\">\u0425\u0440\u0430\u043d\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u043c\u0430\u043f\u044b<\/h3>\n<p>  <\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c <code>bpftrace<\/code> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u0430 C \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>:?<\/code>, <code>++<\/code>, <code>--<\/code>. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 <code>if {} else {}<\/code>. \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0446\u0438\u043a\u043b\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>while<\/code> \u0438 \u044d\u043a\u0437\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e <code>unroll<\/code> (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 BPF \u0446\u0438\u043a\u043b\u044b \u0431\u044b\u043b\u0438 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b). \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0436\u0435 \u0432\u043e \u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044f\u0434\u0440\u0430, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u0432\u0443\u0445 \u0442\u0438\u043f\u043e\u0432: \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0437\u043d\u0430\u043a\u0430 \u0434\u043e\u043b\u043b\u0430\u0440\u0430 <code>$<\/code> \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u0431\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'BEGIN { $x = 1; printf(&quot;%d\\n&quot;, ++$x); exit(); }' # bpftrace -e 'BEGIN { if (1) { $x = 1; } printf(&quot;%d\\n&quot;, ++$x); exit(); }'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u2014 \u043d\u0435\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'BEGIN { $x = 1; exit(); } END { printf(&quot;%d\\n&quot;, $x); }'<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u0432\u044b\u0448\u0435, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0437\u043d\u0430\u043a\u0430 <code>@<\/code> \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c &quot;\u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u0443\u044e&quot; \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>@<\/code>, \u043a\u0430\u043a \u043c\u044b \u0434\u0435\u043b\u0430\u043b\u0438 \u0432\u044b\u0448\u0435 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0437\u043e\u0432\u0430 <code>write<\/code> (<code>@[tid]<\/code>). (\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 <code>bpftrace<\/code> \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043c\u0430\u043f\u0430\u0445 \u2014 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0430\u0437\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445 \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u043d\u0438, \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0447\u0438\u043c, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0432 \u0431\u043e\u043b\u0435\u0435 \u043e\u0431\u0449\u0435\u043c \u0441\u043c\u044b\u0441\u043b\u0435: \u043b\u044e\u0431\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u0440\u0443\u0442\u043e\u0432\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0445 \u0447\u0438\u0442\u0430\u0442\u044c \u0438 \u043f\u0438\u0441\u0430\u0442\u044c. \u041d\u043e \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u0432\u0430\u0436\u043d\u043e, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0435\u0440\u0438\u0438, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438.)<\/p>\n<p>  <\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c, \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443: \u0437\u0430\u0447\u0435\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0438 \u0447\u0442\u043e \u043c\u044b \u0432 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c? \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code>bpftrace<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u0414\u043b\u044f <code>kprobes<\/code> \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0434\u043b\u044f <code>tracepoints<\/code> \u2014 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 tracepoint, \u0430 \u0434\u043b\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 Perf, \u043a\u0430\u043a \u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u2014 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041c\u044b \u0443\u0436\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u043a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 <code>tracepoints<\/code>, \u0432 \u044d\u0442\u043e\u0439 \u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0435\u043a\u0446\u0438\u044f\u0445 \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 <code>kprobes<\/code>, \u0430 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 <a href=\"#tutorial-flame\">\u0412\u0435\u0441\u0435\u043b\u044b\u0435 \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438<\/a> \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f Perf.<\/p>\n<p>  <\/p>\n<p>\u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b <code>kprobes<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a\u0430\u043a <code>arg0<\/code>, <code>arg1<\/code>, \u0438 \u0442.\u0434. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0442\u0438\u043f\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0438\u0445 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e. \u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">#include &lt;linux\/skbuff.h&gt; #include &lt;linux\/ip.h&gt;  k:icmp_echo { \u00a0 \u00a0 $skb = (struct sk_buff *) arg0; \u00a0 \u00a0 $iphdr = (struct iphdr *) ($skb-&gt;head + $skb-&gt;network_header); \u00a0 \u00a0 @pingstats[ntop($iphdr-&gt;saddr), ntop($iphdr-&gt;daddr)]++; }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u0442\u0440\u043e\u0438\u0442 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043e \u0442\u043e\u043c, \u043a\u0442\u043e \u043f\u0438\u043d\u0433\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u0445\u043e\u0441\u0442. \u041c\u044b \u0446\u0435\u043f\u043b\u044f\u0435\u043c\u0441\u044f \u043a <code>kprobe<\/code> \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <a href=\"https:\/\/github.com\/torvalds\/linux\/blob\/v5.9\/net\/ipv4\/icmp.c#L962-L980\" rel=\"nofollow noopener noreferrer\"><code>icmp_echo<\/code><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434 ICMPv4 \u043f\u0430\u043a\u0435\u0442\u0430 \u0442\u0438\u043f\u0430 echo request. \u0415\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, <code>arg0<\/code> \u0432 \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u2014 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0442\u0438\u043f\u0430 <code>sk_buff<\/code>, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u043f\u0430\u043a\u0435\u0442. \u0418\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u044b \u0434\u043e\u0441\u0442\u0430\u0435\u043c IP \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>@pingstats<\/code>. \u0412\u0441\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043e \u0442\u043e\u043c, \u043a\u0442\u043e \u0438 \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u043d\u0433\u043e\u0432\u0430\u043b \u043d\u0430\u0448\u0438 IP \u0430\u0434\u0440\u0435\u0441\u0430! \u0420\u0430\u043d\u044c\u0448\u0435 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u0430\u043c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u044f\u0434\u0440\u0430, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a kprobe, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 user space, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437. \u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0434\u0432\u0430 \u0445\u0435\u0434\u0435\u0440\u0430 \u044f\u0434\u0440\u0430, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0441 kernel headers. \u042d\u0442\u0438 \u0445\u0435\u0434\u0435\u0440\u044b \u043d\u0443\u0436\u043d\u044b \u043d\u0430\u043c \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 <code>sk_buff<\/code> \u0438 <code>iphdr<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0442\u044c. (\u0415\u0441\u043b\u0438 \u0431\u044b \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b \u0441\u043e\u0431\u0440\u0430\u043d BTF, \u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u043d\u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442, \u043d\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0445\u0435\u0434\u0435\u0440\u044b.) \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>icmp_echo<\/code> \u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043d\u0430 <code>sk_buff<\/code> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>$skb<\/code>. \u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043c\u044b \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c <code>$skb<\/code> \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0435\u0441\u0442\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u043d\u0430 <code>iphdr<\/code>. \u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>ntop<\/code> \u044f\u0437\u044b\u043a\u0430 <code>bpftrace<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 IP \u0430\u0434\u0440\u0435\u0441 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<p>  <\/p>\n<p><b>\u0423\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435.<\/b> \u0412\u043e\u0437\u044c\u043c\u0438\u0442\u0435 \u043b\u044e\u0431\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0443\u044e \u0432\u0430\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u044f\u0434\u0440\u0430 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0435\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e <code>uptr<\/code> \u0438 <code>kptr<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0432\u043e\u0437\u044c\u043c\u0438\u0442\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>vfs_write<\/code> \u044f\u0434\u0440\u0430, \u0435\u0435 \u043f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 <code>struct file<\/code>, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 <code>&lt;linux\/fs.h&gt;<\/code>. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0432\u0430\u0441 \u0444\u043b\u0430\u0433\u0438 \u0444\u0430\u0439\u043b\u0430 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>vfs_write<\/code>. (Hint: \u043a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 <code>struct file<\/code> \u0432\u043d\u0443\u0442\u0440\u044c <code>kretprobe<\/code>?)<\/p>\n<p>  <\/p>\n<p><b>\u0423\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435.<\/b> \u041d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 <code>bpftrace<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0438\u043c\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0432\u0441\u044f\u043a\u0438\u0439 \u0440\u0430\u0437, \u043a\u0430\u043a \u043e\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>sudo<\/code>.<\/p>\n<p>  <\/p>\n<h3 id=\"tutorial-count\">\u0421\u0447\u0438\u0442\u0430\u0435\u043c \u0438 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043f\u0440\u043e <code>ping<\/code> \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0443 \u2014 \u043d\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u043b\u0438\u0441\u044c \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 CPU. \u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>count<\/code>. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'p:hz:5000 { @x++; @y = count(); } i:s:10 { exit(); }' Attaching 2 probes... @x: 760528 @y: 799002<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u043f\u043e 5000 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 16 \u044f\u0434\u0435\u0440 \u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0432\u0443\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 <code>@x<\/code> \u0438 <code>@y<\/code>. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>++<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u043e\u0447\u043d\u043e\u0435. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>count()<\/code> \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0436\u0435 \u0431\u0435\u0437\u043e \u0432\u0441\u044f\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 CPU-\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 CPU \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0441\u0432\u043e\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438 \u043f\u0435\u0447\u0430\u0442\u0438 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 <code>bpftrace<\/code> \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0431\u0430\u0433\u0438 \u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0442\u0443\u0442 \u2014 \u044d\u0442\u043e \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'kr:vfs_write { @ = hist(retval); } i:s:10 { exit() }' Attaching 2 probes...  @: [1]             14966407 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@| [2, 4)                 0 |                                                    | [4, 8)                 0 |                                                    | [8, 16)             1670 |                                                    | [16, 32)               0 |                                                    | [32, 64)             123 |                                                    | [64, 128)              0 |                                                    | [128, 256)             0 |                                                    | [256, 512)             0 |                                                    | [512, 1K)              0 |                                                    | [1K, 2K)               0 |                                                    | [2K, 4K)               0 |                                                    | [4K, 8K)               0 |                                                    | [8K, 16K)        7531982 |@@@@@@@@@@@@@@@@@@@@@@@@@@                          |<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0434\u0435\u0441\u044f\u0442\u0438 \u0441\u0435\u043a\u0443\u043d\u0434 \u043c\u044b \u0441\u0442\u0440\u043e\u0438\u043c \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>vfs_write<\/code>, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u043e \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0447\u0443\u0442\u044c \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 (\u0442\u043e \u0437\u0430\u043d\u044f\u043b\u043e \u0443 \u043c\u0435\u043d\u044f \u043e\u043a\u043e\u043b\u043e 20 \u0441\u0435\u043a\u0443\u043d\u0434):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e '     kr:vfs_write \/retval == 1\/ { @[pid, comm] = hist(retval); }     i:s:10 { exit() }     END { print(@, 1); clear(@); }' Attaching 3 probes... @[133835, dd]: [1]             14254511 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code>retval<\/code> \u0440\u0430\u0432\u0435\u043d \u0435\u0434\u0438\u043d\u0438\u0446\u0435. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0438 \u0438\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432 <code>END<\/code> \u043c\u044b \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0434\u0435\u043b\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439. \u0427\u0442\u043e \u0436\u0435 \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442? \u0414\u0443\u043c\u0430\u044e \u0432\u044b \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># tr '\\000' ' ' &lt; \/proc\/133835\/cmdline dd if=\/dev\/zero of=\/dev\/null bs=1<\/code><\/pre>\n<p>  <\/p>\n<p><b>\u0423\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435.<\/b> \u041d\u0430\u0439\u0434\u0438\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e <code>bpftrace<\/code> \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0432\u0441\u0435 \u0448\u0430\u0433\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>  <\/p>\n<h3 id=\"tutorial-flame\">\u0412\u0435\u0441\u0435\u043b\u044b\u0435 \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0438: flame graphs<\/h3>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0438\u043f\u0430 <code>profile<\/code> \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u043d\u0430\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0422\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u044d\u043c\u043f\u043b\u044b \u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0442\u0438\u043f\u0430 <code>profile<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0444\u043e\u0440\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">profile:hz:rate profile:s:rate profile:ms:rate profile:us:rate<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 HZ, \u0430 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u2014 \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u043d \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">bpftrace -e 'profile:hz:99 { print(kstack); exit() }' Attaching 1 probe...          cpuidle_enter_state+202         cpuidle_enter+46         call_cpuidle+35         do_idle+487         cpu_startup_entry+32         rest_init+174         arch_call_rest_init+14         start_kernel+1724         x86_64_start_reservations+36         x86_64_start_kernel+139         secondary_startup_64+182<\/code><\/pre>\n<p>  <\/p>\n<p>\u0437\u0434\u0435\u0441\u044c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u043d\u0430 \u044f\u0434\u0440\u043e-\u0431\u0435\u0437\u0434\u0435\u043b\u044c\u043d\u0438\u043a\u0430.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u0434\u043d\u0430\u043a\u043e, \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0441\u0442\u0435\u043a\u043e\u0432 \u044f\u0434\u0440\u0430 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0411\u0413 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/github.com\/brendangregg\/FlameGraph\" rel=\"nofollow noopener noreferrer\">flame graphs<\/a>, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0443\u0434\u043e\u0431\u043d\u0443\u044e \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <code>bpftrace<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># bpftrace -e 'profile:hz:333 { @[kstack] = count(); } i:s:10 { exit() }' &gt; \/tmp\/raw # wc -l \/tmp\/raw 3374 \/tmp\/raw<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e 333 \u0440\u0430\u0437\u0430 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0441\u044d\u043c\u043f\u043b\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0435\u043a \u044f\u0434\u0440\u0430 \u0438 \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043c\u044b \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0442\u0435\u043a\u0438 (\u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>kstack<\/code> \u043a\u0430\u043a \u043a\u043b\u044e\u0447 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 <code>@<\/code>, \u0432\u0435\u0434\u044c <code>kstack<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430).<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 FlameGraph \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ git clone https:\/\/github.com\/brendangregg\/FlameGraph.git $ cd FlameGraph $ .\/stackcollapse-bpftrace.pl \/tmp\/raw &gt; \/tmp\/ready $ .\/flamegraph.pl \/tmp\/ready &gt; \/tmp\/kstack.svg<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0432\u044b\u0432\u043e\u0434 <code>bpftrace<\/code> \u043a \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0432\u0438\u0434\u0443, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0438\u0442 \u043f\u043e \u043d\u0435\u043c\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 (\u043a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u043b\u0441\u044f gist \u0441 SVG):<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/gist.githubusercontent.com\/aspsk\/19402203a841bac819049ae571845ede\/raw\/9e0d3c3bc8cb8776494a33f0c347937eec9a28b6\/kstack.svg\" rel=\"nofollow noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/n8\/fk\/ro\/n8fkrowxakk7-lotzxtjd0ea4g4.png\"><\/a><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0431\u0435\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442, \u0430 \u043d\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 CPU \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 <code>dd<\/code>, \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0449\u0438\u0439 <code>\/dev\/zero<\/code> \u0432 <code>\/dev\/null<\/code> \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443. \u041a\u043b\u0438\u043a\u0430\u0439\u0442\u0435 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p><b>\u0423\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u0435.<\/b> \u0421\u043d\u0438\u043c\u043a\u0438 \u0441\u0442\u0435\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>bpftrace<\/code>. \u0417\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 <code>FlameGraph<\/code> \u0438 \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0441\u043d\u0438\u043c\u043e\u043a \u0441\u0432\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c.<\/p>\n<p>  <\/p>\n<h3 id=\"tutorial-end\">\u041f\u043e\u0440\u0430 \u0437\u0430\u043a\u0440\u0443\u0433\u043b\u044f\u0442\u044c\u0441\u044f<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0442\u043e \u0432\u044b \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u0432 \u043d\u0435\u043b\u0435\u0433\u043a\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>bpftrace<\/code>. \u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c \u043a\u0443\u0434\u0430 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  <\/p>\n<h1 id=\"bcc\">BCC: \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/h1>\n<p>  <\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0443 <abbr title=\"BPF Compiler Collection\">BCC<\/abbr> \u043b\u044e\u0434\u0438, \u0440\u043e\u0431\u043e\u0442\u044b \u0438 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 BPF \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0443\u0442\u0440\u0443\u0436\u0434\u0430\u0442\u044c \u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u2014 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <a href=\"https:\/\/github.com\/iovisor\/bcc\/tree\/master\/tools\" rel=\"nofollow noopener noreferrer\">\u043f\u043e\u0447\u0442\u0438 100 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442<\/a>. \u042d\u0442\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u2014 \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b, \u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u043e\u0432\u0441\u0435\u0434\u043d\u0435\u0432\u043d\u043e \u0432 \u043d\u0435\u0434\u0440\u0430\u0445 Netflix, Facebook \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0434\u043e\u0431\u0440\u0430. \u0421\u043c. \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043d\u0438\u0436\u043a\u0438 <abbr title=\"\u0411\u0440\u0435\u043d\u0434\u0430\u043d \u0413\u0440\u0435\u0433\u0433, \u0430 \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438\">\u0411\u0413<\/abbr> \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0443\u0442\u0438\u043b\u0438\u0442 \u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0447\u0435\u043c\u0443 \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 <code>libbcc<\/code> \u0438 <code>libbpf<\/code> \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043a\u043e\u0434 \u043d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u043a\u0443\u0441\u043a\u0438 \u043f\u0441\u0435\u0432\u0434\u043e-C \u043a\u043e\u0434\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0438\u0445 \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0434\u0430\u0436\u0435 \u043d\u0430 \u0431\u043e\u0435\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. \u0422\u0430\u043a\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438, \u0441\u043c. \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b.<\/p>\n<p>  <\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u044b BCC \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043e\u043f\u0430\u043a\u0435\u0447\u0435\u043d\u044b \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0443\u0431\u0443\u043d\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>bpfcc-tools<\/code>. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0438\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u043c\u0430\u043d\u0434\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># funccount-bpfcc 'vfs_*' -d 5 Tracing 67 functions for &quot;b'vfs_*'&quot;... Hit Ctrl-C to end.  FUNC                                    COUNT b'vfs_statfs'                               1 b'vfs_unlink'                               1 b'vfs_lock_file'                            2 b'vfs_fallocate'                           31 b'vfs_statx_fd'                            32 b'vfs_getattr'                             80 b'vfs_getattr_nosec'                       88 b'vfs_open'                               108 b'vfs_statx'                              174 b'vfs_writev'                            2789 b'vfs_write'                             6554 b'vfs_read'                              7363 Detaching...<\/code><\/pre>\n<p>  <\/p>\n<p>\u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0431\u044b\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0434\u0440\u0430 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c <code>vfs_<\/code> \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0435 \u0432 \u043f\u044f\u0442\u044c \u0441\u0435\u043a\u0443\u043d\u0434. \u0427\u0443\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435 \u043f\u043e\u0434\u0441\u0443\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <code>-p<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f PID \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u043e\u0439 <code>mplayer<\/code>, \u043f\u043e\u043a\u0430 \u044f \u044d\u0442\u043e \u043f\u0438\u0448\u0443:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># funccount-bpfcc 'vfs_*' -d 5 -p 29380 Tracing 67 functions for &quot;b'vfs_*'&quot;... Hit Ctrl-C to end.  FUNC                                    COUNT b'vfs_write'                              208 b'vfs_read'                               629 Detaching...<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"new-bcc-tool\">\u041f\u0438\u0448\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 BCC<\/h3>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 BCC. \u042d\u0442\u0430 \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0431\u044b\u043b\u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u044f\u0434\u0440\u0430 <code>mutex_lock<\/code> \u0438 <code>mutex_unlock<\/code>. \u0415\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0434\u0430\u043b\u0435\u0435, \u0442\u0430\u043a\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e <a href=\"https:\/\/gist.github.com\/aspsk\/cdd53cba9ca55d3c3186981fe71dbda7\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">#! \/usr\/bin\/python3  from bcc import BPF from ctypes import c_int from time import sleep, strftime from sys import argv  b = BPF(text=&quot;&quot;&quot; BPF_PERCPU_ARRAY(mutex_stats, u64, 2);  static inline void inc(int key) {     u64 *x = mutex_stats.lookup(&amp;key);     if (x)         *x += 1; }  void do_lock(struct pt_regs *ctx) { inc(0); } void do_unlock(struct pt_regs *ctx) { inc(1); } &quot;&quot;&quot;)  b.attach_kprobe(event=&quot;mutex_lock&quot;, fn_name=&quot;do_lock&quot;) b.attach_kprobe(event=&quot;mutex_unlock&quot;, fn_name=&quot;do_unlock&quot;)  print(&quot;%-8s%10s%10s&quot; % (&quot;TIME&quot;, &quot;LOCKED&quot;, &quot;UNLOCKED&quot;))  while 2 * 2 == 4:      try:         sleep(1)     except KeyboardInterrupt:         exit()      print(&quot;%-8s%10d%10d&quot; % (           strftime(&quot;%H:%M:%S&quot;),           b[&quot;mutex_stats&quot;].sum(0).value,           b[&quot;mutex_stats&quot;].sum(1).value))      b[&quot;mutex_stats&quot;].clear()<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0442\u0443\u0442 \u2014 \u044d\u0442\u043e \u0438\u043c\u043f\u043e\u0440\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <code>BPF<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">from bcc import BPF<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b BPF, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u043b\u0430\u0441\u0441 <code>BPF<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 \u043f\u0441\u0435\u0432\u0434\u043e-C. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">BPF_PERCPU_ARRAY(mutex_stats, u64, 2);  static inline void inc(int key) {     u64 *x = mutex_stats.lookup(&amp;key);     if (x)         *x += 1; }  void do_lock(struct pt_regs *ctx)   { inc(0); } void do_unlock(struct pt_regs *ctx) { inc(1); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c C, \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435, \u043d\u043e \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>BPF<\/code> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0430 C.<br \/>  \u0422\u0430\u043a \u0438\u043b\u0438 \u0438\u043d\u0430\u0447\u0435, \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 <code>mutex_stats<\/code> \u0438\u0437 \u0434\u0432\u0443\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0442\u0438\u043f\u0430 <code>u64<\/code>, \u043d\u0430\u0448\u0438\u0445 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432. \u0417\u0430\u043c\u0435\u0442\u044c\u0442\u0435, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 PERCPU \u043c\u0430\u0441\u0441\u0438\u0432, \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e CPU \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0441\u0432\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>inc<\/code>, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0443\u044e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 <code>mutex_stats<\/code>. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430.<br \/>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>do_lock<\/code> \u0438 <code>do_unlock<\/code> \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044e\u0442 \u043a\u0430\u0436\u0434\u0430\u044f \u0441\u0432\u043e\u0439 \u0441\u0447\u0435\u0442\u0447\u0438\u043a.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0441 \u044f\u0434\u0435\u0440\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e \u2014 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441 <code>BPF<\/code> \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 <code>libllvm<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434, \u0438 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043b\u044c\u0435\u0442 \u0435\u0433\u043e \u0432 \u044f\u0434\u0440\u043e. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c \u043d\u0430\u0441 <code>kprobes<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">b.attach_kprobe(event=&quot;mutex_lock&quot;, fn_name=&quot;do_lock&quot;) b.attach_kprobe(event=&quot;mutex_unlock&quot;, fn_name=&quot;do_unlock&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0431\u043e\u0440\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">print(&quot;%-8s%10s%10s&quot; % (&quot;TIME&quot;, &quot;LOCKED&quot;, &quot;UNLOCKED&quot;))  while 2 * 2 == 4:      try:         sleep(1)     except KeyboardInterrupt:         exit()      print(&quot;%-8s%10d%10d&quot; % (           strftime(&quot;%H:%M:%S&quot;),           b[&quot;mutex_stats&quot;].sum(0).value,           b[&quot;mutex_stats&quot;].sum(1).value))      b[&quot;mutex_stats&quot;].clear()<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0447\u0430\u0442\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 <code>mutex_stats<\/code>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>sum<\/code> \u043c\u0430\u0441\u0441\u0438\u0432\u0430 <code>mutex_stats<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e CPU:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">sum(index) {     result = 0     \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e CPU {         result += cpu-&gt;mutex_stats[index]     }     return result }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0435. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">$ sudo .\/bcc-tool-example TIME        LOCKED  UNLOCKED 18:06:33     11382     12993 18:06:34     11200     12783 18:06:35     18597     22553 18:06:36     20776     25516 18:06:37     59453     68201 18:06:38     49282     58064 18:06:39     25541     27428 18:06:40     22094     25280 18:06:41      5539      7250 18:06:42      5662      7351 18:06:43      5205      6905 18:06:44      6733      8438<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u0434\u0435-\u0442\u043e \u0432 18:06:35 \u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0441 youtube \u0432 Firefox, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b youtube \u043d\u0430 \u043f\u0430\u0443\u0437\u0443 \u0438 \u0437\u0430\u0442\u0435\u043c \u0432 18:06:40 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u043d\u0430\u0437\u0430\u0434 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b. \u0418\u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 youtube \u0432\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u044f\u0434\u0440\u043e \u043b\u043e\u043a\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043e\u0440\u043e\u043a \u0442\u044b\u0441\u044f\u0447 \u043c\u044c\u044e\u0442\u0435\u043a\u0441\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 C, \u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 <code>libbpf<\/code> \u0438 CO-RE. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>libbpf<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0442\u044f\u0436\u0435\u043b\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u0442\u0438\u043f\u0430 <code>libllvm<\/code>, \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b BCC \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 <code>libbpf<\/code> + CO-RE \u043f\u0440\u044f\u043c\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 BCC, \u0441\u043c. <a href=\"https:\/\/github.com\/iovisor\/bcc\/tree\/master\/libbpf-tools\" rel=\"nofollow noopener noreferrer\">libbpf-tools<\/a>. \u0417\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435\u0441\u044c \u043a \u0441\u0442\u0430\u0442\u044c\u0435 <a href=\"https:\/\/nakryiko.com\/posts\/bcc-to-libbpf-howto-guide\/\" rel=\"nofollow noopener noreferrer\">BCC to libbpf conversion guide<\/a> (\u0438\u043b\u0438 \u0436\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438).<\/p>\n<p>  <\/p>\n<h1 id=\"ply\">Ply: bpftrace \u0434\u043b\u044f \u0431\u0435\u0434\u043d\u044b\u0445<\/h1>\n<p>  <\/p>\n<p>\u0423\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/github.com\/wkz\/ply\" rel=\"nofollow noopener noreferrer\"><code>ply<\/code><\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u0448\u0432\u0435\u0434\u043e\u043c Tobias Waldekranz \u0432 <abbr title=\"\u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f BPF\">\u0434\u043e\u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u043c<\/abbr> 2015 \u0433\u043e\u0434\u0443, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435 \u043f\u0440\u044f\u043c\u044b\u043c \u043f\u0440\u0435\u0434\u043a\u043e\u043c <code>bpftrace<\/code>. \u041e\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 awk-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u044f\u0434\u0440\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 BPF, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">ply 'tracepoint:tcp\/tcp_receive_reset {     printf(&quot;saddr:%v port:%v-&gt;%v\\n&quot;, data-&gt;saddr, data-&gt;sport, data-&gt;dport); }'<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e <code>ply<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439: \u0435\u0439 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e <code>libc<\/code> (\u043b\u044e\u0431\u0430\u044f). \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0438\u043b\u0438\u044f\u043c\u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0432 BPF \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445. \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0440\u0435\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0432 <code>ply<\/code> \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <code>ply script language -&gt; BPF<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u043d\u0435 \u0443\u043c\u0430\u043b\u044f\u044f \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432 <code>ply<\/code>, \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043a \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0433\u043b\u043e\u0445\u043b\u0430 \u2014 <code>ply<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043d\u043e\u0432\u044b\u0435 \u0444\u0438\u0447\u0438 \u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f. \u0412\u044b \u0432\u0441\u0435 \u0435\u0449\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>ply<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u044f\u0434\u0440\u0430 \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438\u043b\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432, \u043d\u043e \u044f \u0431\u044b \u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b \u0441\u0440\u0430\u0437\u0443 \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430 C \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>libbpf<\/code> \u2014 \u0434\u043b\u044f \u044d\u043c\u0431\u0435\u0434\u0449\u0438\u043a\u043e\u0432 \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430, \u0441\u043c., \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u0442\u0430\u0442\u044c\u044e <a href=\"https:\/\/nakryiko.com\/posts\/libbpf-bootstrap\/\" rel=\"nofollow noopener noreferrer\">Building BPF applications with libbpf-bootstrap<\/a>.<\/p>\n<p>  <\/p>\n<h1>\u0421\u0441\u044b\u043b\u043a\u0438<\/h1>\n<p>  <\/p>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0441\u0435\u0440\u0438\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/493880\/\">BPF \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u0447\u0430\u0441\u0442\u044c 0: classic BPF<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/514736\/\">BPF \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u0447\u0430\u0441\u0442\u044c 1: extended BPF<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/529316\/\">BPF \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445, \u0447\u0430\u0441\u0442\u044c 2: \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c BPF<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u043e <code>bpftrace<\/code>, BCC \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0435 Linux:<\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/docs\/tutorial_one_liners.md#the-bpftrace-one-liner-tutorial\" rel=\"nofollow noopener noreferrer\">The bpftrace One-Liner Tutorial.<\/a> \u042d\u0442\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e <code>bpftrace<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u0434\u0432\u0435\u043d\u0430\u0434\u0446\u0430\u0442\u0438 \u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0445, \u0438\u043b\u0438 \u043e\u043a\u043e\u043b\u043e \u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.<\/p>\n<p>  <\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/docs\/reference_guide.md#bpftrace-reference-guide\" rel=\"nofollow noopener noreferrer\">bpftrace Reference Guide.<\/a> \u0412\u0441\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>bpftrace<\/code>, \u043d\u043e \u0431\u043e\u044f\u043b\u0438\u0441\u044c \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u043c\u0430\u043b\u043e, \u0442\u043e \u0438\u0434\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e <a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/docs\/internals_development.md\" rel=\"nofollow noopener noreferrer\">\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/a> <code>bpftrace<\/code>.<\/p>\n<p>  <\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/docs\/tutorial.md\" rel=\"nofollow noopener noreferrer\">BCC Tutorial.<\/a> \u0415\u0441\u043b\u0438 \u0432\u044b \u043e\u0441\u0432\u043e\u0438\u043b\u0438\u0441\u044c \u0441 <code>bpftrace<\/code> \u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043a\u043e\u043f\u043d\u0443\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435 (\u043d\u043e \u0435\u0449\u0435 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u043e\u0441\u0432\u043e\u0435\u043d\u0438\u044e <code>libbpf<\/code> \u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c), \u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e BCC, \u043d\u0430 <a href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/docs\/reference_guide.md\" rel=\"nofollow noopener noreferrer\">BCC Reference Guide<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430 \u043a\u043d\u0438\u0436\u043a\u0438, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435.<\/p>\n<p>  <\/li>\n<li>\n<p><a href=\"http:\/\/www.brendangregg.com\/bpf-performance-tools-book.html\" rel=\"nofollow noopener noreferrer\">Brendan Gregg, \u00abBPF Performance Tools\u00bb<\/a>. \u0411\u0413 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043b \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b BPF \u0432 \u0434\u0435\u043b\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 Linux \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u043d\u0438\u0436\u043a\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043f\u044f\u0442\u0438 \u043b\u0435\u0442 \u2014 \u0441\u043e\u0442\u043d\u044e \u0438\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u044b\u0445 \u0443\u0442\u0438\u043b\u0438\u0442 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 BCC. \u041a\u043d\u0438\u0436\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u044b\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u043e BPF \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439.<\/p>\n<p>  <\/li>\n<li>\n<p><a href=\"http:\/\/www.brendangregg.com\/systems-performance-2nd-edition-book.html\" rel=\"nofollow noopener noreferrer\">Brendan Gregg, \u00abSystems Performance: Enterprise and the Cloud, 2nd Edition (2020)\u00bb<\/a>. \u042d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0435 \u0438\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u043c\u0435\u043d\u0438\u0442\u043e\u0439 \u00abSystems Performance\u00bb. \u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e BPF, \u0432\u044b\u043a\u0438\u043d\u0443\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e Solaris, \u0430 \u0441\u0430\u043c \u0411\u0413 \u0441\u0442\u0430\u043b \u043d\u0430 \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u043e\u043f\u044b\u0442\u043d\u0435\u0435. \u0415\u0441\u043b\u0438 \u043a\u043d\u0438\u0436\u043a\u0430 \u00abBPF Performance Tools\u00bb \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0430\u043a?\u00bb, \u0442\u043e \u044d\u0442\u0430 \u043a\u043d\u0438\u0436\u043a\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043f\u043e\u0447\u0435\u043c\u0443?\u00bb, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0435\u0445\u043d\u0438\u043a\u0430\u0445 (\u043d\u0435 BPF \u0435\u0434\u0438\u043d\u044b\u043c \u0436\u0438\u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a).<\/p>\n<p>  <\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/542560\/\"> https:\/\/habr.com\/ru\/post\/542560\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\n<p>\u042d\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u00abBPF \u0434\u043b\u044f \u0441\u0430\u043c\u044b\u0445 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445\u00bb (<a href=\"https:\/\/habr.com\/ru\/post\/493880\/\">0<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/514736\/\">1<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/529316\/\">2<\/a>) \u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u0440\u043e \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0443 Linux \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0418\u0437 \u043d\u0435\u0435 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0438 \u044f\u0437\u044b\u043a\u0435 <code>bpftrace<\/code> \u2014 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432 \u043c\u0438\u0440 BPF \u0441 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u043f\u0440\u043e BPF \u0440\u043e\u0432\u043d\u044b\u043c \u0441\u0447\u0435\u0442\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 <code>bpftrace<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438 \u043f\u043e\u0434\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0438\u0445 \u043a \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u044f\u0434\u0440\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u041a\u041f\u0414\u0412 \u043d\u0438\u0436\u0435\u2026 \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u044e, \u0432\u044b \u0443\u0436\u0435 \u0443\u043c\u0435\u0435\u0442\u0435 \u0442\u0440\u0435\u0439\u0441\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>bpftrace<\/code>!<\/p>\n<p>  <\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u0441\u0435\u0440\u0438\u0438, \u044d\u0442\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0430\u044f \u0438 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u044f\u0442\u0438 \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043e \u043b\u044e\u0431\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438 \u0432 \u044f\u0434\u0440\u0435 Linux \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u0445 \u2014 <code>ply<\/code> \u0438 BCC. <s>\u041c\u0438\u043d\u0443\u0442\u044b \u0432\u043e \u0444\u0440\u0430\u0437\u0435 \u00ab\u043f\u043e\u0441\u043b\u0435 \u043f\u044f\u0442\u0438 \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f\u00bb \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0442\u0441\u044f \u043c\u0435\u0440\u043a\u0443\u0440\u0438\u0430\u043d\u0441\u043a\u0438\u0435. \u041f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043f\u044f\u0442\u0438 \u043c\u0438\u043d\u0443\u0442 \u0447\u0442\u0435\u043d\u0438\u044f \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/s><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/-t\/t0\/nb\/-tt0nbuuleaiqi-j3uhtesdf6vq.png\" title=\"bpftrace magic\"><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-318058","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318058","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=318058"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318058\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=318058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=318058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=318058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}