<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>eBPF 공부방-Parca</title>
    <link>https://overfrost.tistory.com/</link>
    <description>eBPF 공부방입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 22 Jun 2026 17:43:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>SysBPF</managingEditor>
    <image>
      <title>eBPF 공부방-Parca</title>
      <url>https://tistory1.daumcdn.net/tistory/8453983/attach/fb0a5e9ae28f43a8b321f14fcc975ee7</url>
      <link>https://overfrost.tistory.com</link>
    </image>
    <item>
      <title>10편. Parca는 누구에게 필요한 도구인가&amp;ndash; 도입 판단 가이드 &amp;amp; 정리</title>
      <link>https://overfrost.tistory.com/12</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-id=&quot;fe2655f2-2c96-4cfa-8cbb-c8a661eb3c8b&quot; data-message-author-role=&quot;user&quot;&gt;
&lt;div&gt;
&lt;div data-multiline=&quot;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-5-2&quot; data-message-id=&quot;12e8f364-2192-4a69-81b8-ea75814b47c6&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-end=&quot;79&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;아래는 &lt;b&gt;10편(최종편) 전체 본문 확장판 초안&lt;/b&gt;입니다.&lt;br /&gt;이 편은 연재의 &lt;b&gt;결론 + 도입 판단 가이드&lt;/b&gt; 역할을 하도록 구성했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;190&quot; data-start=&quot;81&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;117&quot; data-start=&quot;81&quot;&gt;&amp;ldquo;Parca가 좋은가?&amp;rdquo;가 아니라 &lt;b&gt;&amp;ldquo;누가 써야 하는가&amp;rdquo;&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;137&quot; data-start=&quot;118&quot;&gt;기술적 적합성 + 조직적 적합성&lt;/li&gt;
&lt;li data-end=&quot;157&quot; data-start=&quot;138&quot;&gt;도입해도 실패하는 경우까지 포함&lt;/li&gt;
&lt;li data-end=&quot;190&quot; data-start=&quot;158&quot;&gt;CTO / SRE / 플랫폼 팀이 읽어도 설득되는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;195&quot; data-start=&quot;192&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;221&quot; data-start=&quot;197&quot;&gt;Parca는 누구에게 필요한 도구인가&lt;/h1&gt;
&lt;h2 data-end=&quot;242&quot; data-start=&quot;222&quot; data-ke-size=&quot;size26&quot;&gt;도입 판단 가이드 &amp;amp; 연재 정리&lt;/h2&gt;
&lt;p data-end=&quot;276&quot; data-start=&quot;244&quot; data-ke-size=&quot;size16&quot;&gt;이 연재를 여기까지 읽었다면,&lt;br /&gt;이제 질문은 단순해진다.&lt;/p&gt;
&lt;blockquote data-end=&quot;330&quot; data-start=&quot;278&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;330&quot; data-start=&quot;280&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;Parca는 쓸 수 있는 도구인가?&amp;rdquo; ❌&lt;br /&gt;&lt;b&gt;&amp;ldquo;우리에게 필요한 도구인가?&amp;rdquo; ⭕&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;378&quot; data-start=&quot;332&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 &lt;b&gt;좋은 도구&lt;/b&gt;다.&lt;br /&gt;하지만 &lt;b&gt;모두에게 필요한 도구는 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;445&quot; data-start=&quot;380&quot; data-ke-size=&quot;size16&quot;&gt;이번 마지막 편에서는&lt;br /&gt;Parca 도입 여부를 판단할 수 있도록&lt;br /&gt;&lt;b&gt;사람&amp;middot;조직&amp;middot;문제 유형 기준으로 정리&lt;/b&gt;한다.&lt;/p&gt;
&lt;hr data-end=&quot;450&quot; data-start=&quot;447&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;480&quot; data-start=&quot;452&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ Parca는 어떤 문제를 푸는 도구인가&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr2UtC/dJMcahCY4LG/p4KDC14lwT0xyK8knV0Op0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr2UtC/dJMcahCY4LG/p4KDC14lwT0xyK8knV0Op0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr2UtC/dJMcahCY4LG/p4KDC14lwT0xyK8knV0Op0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr2UtC%2FdJMcahCY4LG%2Fp4KDC14lwT0xyK8knV0Op0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;571&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qq8Xg/dJMcahCY4LE/fX5Sb9uIie6ZQ8rY3tMQA0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qq8Xg/dJMcahCY4LE/fX5Sb9uIie6ZQ8rY3tMQA0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qq8Xg/dJMcahCY4LE/fX5Sb9uIie6ZQ8rY3tMQA0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqq8Xg%2FdJMcahCY4LE%2FfX5Sb9uIie6ZQ8rY3tMQA0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;913&quot; height=&quot;653&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;546&quot; data-start=&quot;524&quot; data-ke-size=&quot;size16&quot;&gt;Parca가 푸는 문제는 매우 명확하다.&lt;/p&gt;
&lt;blockquote data-end=&quot;579&quot; data-start=&quot;548&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;579&quot; data-start=&quot;550&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;CPU 시간은 정확히 어디에서 소비되는가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;619&quot; data-start=&quot;581&quot; data-ke-size=&quot;size16&quot;&gt;이 질문에 대한 답이 필요하지 않다면&lt;br /&gt;Parca는 과분한 도구다.&lt;/p&gt;
&lt;hr data-end=&quot;624&quot; data-start=&quot;621&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;645&quot; data-start=&quot;626&quot; data-ke-size=&quot;size23&quot;&gt;Parca가 잘 푸는 질문들&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;783&quot; data-start=&quot;647&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;669&quot; data-start=&quot;647&quot;&gt;CPU 사용률은 정상인데 왜 느린가?&lt;/li&gt;
&lt;li data-end=&quot;698&quot; data-start=&quot;670&quot;&gt;커널과 유저 코드 중 어디에서 병목이 생겼는가?&lt;/li&gt;
&lt;li data-end=&quot;722&quot; data-start=&quot;699&quot;&gt;배포 전/후 성능이 실제로 바뀌었는가?&lt;/li&gt;
&lt;li data-end=&quot;755&quot; data-start=&quot;723&quot;&gt;컨테이너 수 증가가 CPU 경로에 어떤 영향을 줬는가?&lt;/li&gt;
&lt;li data-end=&quot;783&quot; data-start=&quot;756&quot;&gt;APM으로 설명되지 않는 성능 저하의 원인은?&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;788&quot; data-start=&quot;785&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;810&quot; data-start=&quot;790&quot; data-ke-size=&quot;size23&quot;&gt;Parca가 풀지 않는 질문들&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;886&quot; data-start=&quot;812&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;826&quot; data-start=&quot;812&quot;&gt;어떤 API가 느린가?&lt;/li&gt;
&lt;li data-end=&quot;842&quot; data-start=&quot;827&quot;&gt;에러율이 왜 증가했는가?&lt;/li&gt;
&lt;li data-end=&quot;863&quot; data-start=&quot;843&quot;&gt;특정 사용자 요청의 전체 흐름은?&lt;/li&gt;
&lt;li data-end=&quot;886&quot; data-start=&quot;864&quot;&gt;비즈니스 트랜잭션은 어떻게 흘렀는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;912&quot; data-start=&quot;888&quot; data-ke-size=&quot;size16&quot;&gt;  이 질문들은 &lt;b&gt;APM의 영역&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;917&quot; data-start=&quot;914&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;943&quot; data-start=&quot;919&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ Parca가 &amp;ldquo;잘 맞는 사람들&amp;rdquo;&lt;/h2&gt;
&lt;h3 data-end=&quot;971&quot; data-start=&quot;945&quot; data-ke-size=&quot;size23&quot;&gt;① 시스템 프로그래머 / 플랫폼 엔지니어&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;601&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AeMkm/dJMcaiu5HtS/fdKW2k2Hh2XKQF289AMRA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AeMkm/dJMcaiu5HtS/fdKW2k2Hh2XKQF289AMRA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AeMkm/dJMcaiu5HtS/fdKW2k2Hh2XKQF289AMRA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAeMkm%2FdJMcaiu5HtS%2FfdKW2k2Hh2XKQF289AMRA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;601&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;601&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb7L1K/dJMcaiol4HT/6rmFl4PdoGBdkrT4Yqk02K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb7L1K/dJMcaiol4HT/6rmFl4PdoGBdkrT4Yqk02K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb7L1K/dJMcaiol4HT/6rmFl4PdoGBdkrT4Yqk02K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb7L1K%2FdJMcaiol4HT%2F6rmFl4PdoGBdkrT4Yqk02K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;1218&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1077&quot; data-start=&quot;1015&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1034&quot; data-start=&quot;1015&quot;&gt;C/C++ / Rust / Go&lt;/li&gt;
&lt;li data-end=&quot;1061&quot; data-start=&quot;1035&quot;&gt;커널 함수, syscall, lock에 익숙&lt;/li&gt;
&lt;li data-end=&quot;1077&quot; data-start=&quot;1062&quot;&gt;&amp;ldquo;왜?&amp;rdquo;를 파고드는 성향&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1091&quot; data-start=&quot;1079&quot; data-ke-size=&quot;size16&quot;&gt;이들에게 Parca는:&lt;/p&gt;
&lt;blockquote data-end=&quot;1121&quot; data-start=&quot;1093&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1121&quot; data-start=&quot;1095&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;CPU 내부를 그대로 보여주는 현미경&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1126&quot; data-start=&quot;1123&quot; data-ke-size=&quot;size16&quot;&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;1131&quot; data-start=&quot;1128&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1150&quot; data-start=&quot;1133&quot; data-ke-size=&quot;size23&quot;&gt;② SRE / 인프라 팀&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1201&quot; data-start=&quot;1152&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1164&quot; data-start=&quot;1152&quot;&gt;장애 재현이 어려움&lt;/li&gt;
&lt;li data-end=&quot;1184&quot; data-start=&quot;1165&quot;&gt;문제 발생 시 이미 지나가 있음&lt;/li&gt;
&lt;li data-end=&quot;1201&quot; data-start=&quot;1185&quot;&gt;숫자 지표만으로 설명 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1225&quot; data-start=&quot;1203&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 SRE에게 이렇게 말해준다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1259&quot; data-start=&quot;1227&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1259&quot; data-start=&quot;1229&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;문제는 이미 지나갔지만,&lt;br /&gt;흔적은 남아 있다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1264&quot; data-start=&quot;1261&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1295&quot; data-start=&quot;1266&quot; data-ke-size=&quot;size23&quot;&gt;③ Kubernetes / 컨테이너 플랫폼 팀&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmM6TE/dJMcahCY4LF/vKNr8dhJx31A0Nao7F8NgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmM6TE/dJMcahCY4LF/vKNr8dhJx31A0Nao7F8NgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmM6TE/dJMcahCY4LF/vKNr8dhJx31A0Nao7F8NgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmM6TE%2FdJMcahCY4LF%2FvKNr8dhJx31A0Nao7F8NgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;626&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c16lW1/dJMcaiu5HtP/xTwkZk2AV9oo0Nl15hwMK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c16lW1/dJMcaiu5HtP/xTwkZk2AV9oo0Nl15hwMK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c16lW1/dJMcaiu5HtP/xTwkZk2AV9oo0Nl15hwMK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc16lW1%2FdJMcaiu5HtP%2FxTwkZk2AV9oo0Nl15hwMK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;801&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1395&quot; data-start=&quot;1339&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1355&quot; data-start=&quot;1339&quot;&gt;노드 단위 성능 분석 필요&lt;/li&gt;
&lt;li data-end=&quot;1370&quot; data-start=&quot;1356&quot;&gt;컨테이너 간 간섭 문제&lt;/li&gt;
&lt;li data-end=&quot;1395&quot; data-start=&quot;1371&quot;&gt;cgroup / scheduling 이슈&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1404&quot; data-start=&quot;1397&quot; data-ke-size=&quot;size16&quot;&gt;Parca는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1446&quot; data-start=&quot;1406&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1421&quot; data-start=&quot;1406&quot;&gt;컨테이너 추상화를 벗기고&lt;/li&gt;
&lt;li data-end=&quot;1446&quot; data-start=&quot;1422&quot;&gt;&lt;b&gt;실제 커널 실행 경로&lt;/b&gt;를 보여준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1451&quot; data-start=&quot;1448&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1480&quot; data-start=&quot;1453&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ Parca가 &amp;ldquo;잘 맞지 않는 사람들&amp;rdquo;&lt;/h2&gt;
&lt;p data-end=&quot;1496&quot; data-start=&quot;1482&quot; data-ke-size=&quot;size16&quot;&gt;이 부분은 솔직해야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;1501&quot; data-start=&quot;1498&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1525&quot; data-start=&quot;1503&quot; data-ke-size=&quot;size23&quot;&gt;① 애플리케이션 개발자 단독 사용&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1586&quot; data-start=&quot;1527&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1548&quot; data-start=&quot;1527&quot;&gt;Flamegraph 해석 경험 없음&lt;/li&gt;
&lt;li data-end=&quot;1565&quot; data-start=&quot;1549&quot;&gt;커널 함수에 익숙하지 않음&lt;/li&gt;
&lt;li data-end=&quot;1586&quot; data-start=&quot;1566&quot;&gt;&amp;ldquo;이게 느린 건지?&amp;rdquo; 판단 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1600&quot; data-start=&quot;1588&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 Parca는:&lt;/p&gt;
&lt;blockquote data-end=&quot;1628&quot; data-start=&quot;1602&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1628&quot; data-start=&quot;1604&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;멋있지만, 이해하기 어려운 그래프&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1643&quot; data-start=&quot;1630&quot; data-ke-size=&quot;size16&quot;&gt;로 남을 가능성이 크다.&lt;/p&gt;
&lt;hr data-end=&quot;1648&quot; data-start=&quot;1645&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1671&quot; data-start=&quot;1650&quot; data-ke-size=&quot;size23&quot;&gt;② APM 대체를 기대하는 조직&lt;/h3&gt;
&lt;p data-end=&quot;1714&quot; data-start=&quot;1673&quot; data-ke-size=&quot;size16&quot;&gt;❌ Parca = APM&lt;br /&gt;❌ Parca = Prometheus 대체&lt;/p&gt;
&lt;p data-end=&quot;1749&quot; data-start=&quot;1716&quot; data-ke-size=&quot;size16&quot;&gt;이 기대를 가지고 시작하면&lt;br /&gt;도입은 거의 확실히 실패한다.&lt;/p&gt;
&lt;hr data-end=&quot;1754&quot; data-start=&quot;1751&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1774&quot; data-start=&quot;1756&quot; data-ke-size=&quot;size23&quot;&gt;③ 규제/포렌식 목적 환경&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1812&quot; data-start=&quot;1776&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1793&quot; data-start=&quot;1776&quot;&gt;모든 데이터를 빠짐없이 저장&lt;/li&gt;
&lt;li data-end=&quot;1812&quot; data-start=&quot;1794&quot;&gt;특정 시점의 정확한 증거 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1821&quot; data-start=&quot;1814&quot; data-ke-size=&quot;size16&quot;&gt;Parca는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1849&quot; data-start=&quot;1823&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1836&quot; data-start=&quot;1823&quot;&gt;일부 샘플 손실 허용&lt;/li&gt;
&lt;li data-end=&quot;1849&quot; data-start=&quot;1837&quot;&gt;통계적 정확성 기반&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1866&quot; data-start=&quot;1851&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;목적이 다르다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1871&quot; data-start=&quot;1868&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1895&quot; data-start=&quot;1873&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ 조직 기준 도입 판단 가이드&lt;/h2&gt;
&lt;h3 data-end=&quot;1920&quot; data-start=&quot;1897&quot; data-ke-size=&quot;size23&quot;&gt;아래 질문에 &amp;ldquo;예&amp;rdquo;가 많을수록 적합&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2050&quot; data-start=&quot;1922&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1943&quot; data-start=&quot;1922&quot;&gt;성능 문제 재현이 자주 실패하는가?&lt;/li&gt;
&lt;li data-end=&quot;1970&quot; data-start=&quot;1944&quot;&gt;&amp;ldquo;느리다&amp;rdquo;는 말을 수치로 설명하기 어려운가?&lt;/li&gt;
&lt;li data-end=&quot;1992&quot; data-start=&quot;1971&quot;&gt;커널/네이티브 코드 비중이 있는가?&lt;/li&gt;
&lt;li data-end=&quot;2024&quot; data-start=&quot;1993&quot;&gt;Kubernetes 환경에서 노드 병목이 의심되는가?&lt;/li&gt;
&lt;li data-end=&quot;2050&quot; data-start=&quot;2025&quot;&gt;APM + 메트릭만으로 부족함을 느끼는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2078&quot; data-start=&quot;2052&quot; data-ke-size=&quot;size16&quot;&gt;3개 이상이면 &lt;b&gt;도입 검토 가치 충분&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;2083&quot; data-start=&quot;2080&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2107&quot; data-start=&quot;2085&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ Parca의 이상적인 포지션&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GttFc/dJMcahCY4LD/K3bdloiGzkqf5nxB7yAkkk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GttFc/dJMcahCY4LD/K3bdloiGzkqf5nxB7yAkkk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GttFc/dJMcahCY4LD/K3bdloiGzkqf5nxB7yAkkk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGttFc%2FdJMcahCY4LD%2FK3bdloiGzkqf5nxB7yAkkk%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1024&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcdpG8/dJMcaiu5HtU/aBdO6KdThDiokSBuqCqkUK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcdpG8/dJMcaiu5HtU/aBdO6KdThDiokSBuqCqkUK/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcdpG8/dJMcaiu5HtU/aBdO6KdThDiokSBuqCqkUK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcdpG8%2FdJMcaiu5HtU%2FaBdO6KdThDiokSBuqCqkUK%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;571&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2171&quot; data-start=&quot;2151&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 이 위치에 있어야 한다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1766195856429&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Metrics  &amp;rarr; &amp;ldquo;문제가 있다&amp;rdquo;
APM      &amp;rarr; &amp;ldquo;요청은 정상이다&amp;rdquo;
Parca    &amp;rarr; &amp;ldquo;CPU는 여기서 막히고 있다&amp;rdquo;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2255&quot; data-start=&quot;2253&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;2282&quot; data-start=&quot;2257&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2282&quot; data-start=&quot;2259&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Parca는 마지막 퍼즐 조각이다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2287&quot; data-start=&quot;2284&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2317&quot; data-start=&quot;2289&quot; data-ke-size=&quot;size26&quot;&gt;6️⃣ PoC &amp;rarr; 운영으로 가는 현실적인 경로&lt;/h2&gt;
&lt;h3 data-end=&quot;2331&quot; data-start=&quot;2319&quot; data-ke-size=&quot;size23&quot;&gt;추천 도입 순서&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2416&quot; data-start=&quot;2333&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2352&quot; data-start=&quot;2333&quot;&gt;비중요 노드에 agent 배포&lt;/li&gt;
&lt;li data-end=&quot;2369&quot; data-start=&quot;2353&quot;&gt;낮은 샘플링 빈도로 시작&lt;/li&gt;
&lt;li data-end=&quot;2389&quot; data-start=&quot;2370&quot;&gt;Flamegraph 읽는 연습&lt;/li&gt;
&lt;li data-end=&quot;2406&quot; data-start=&quot;2390&quot;&gt;실제 이슈 1~2건 해결&lt;/li&gt;
&lt;li data-end=&quot;2416&quot; data-start=&quot;2407&quot;&gt;그 후 확대&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2421&quot; data-start=&quot;2418&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2441&quot; data-start=&quot;2423&quot; data-ke-size=&quot;size23&quot;&gt;절대 피해야 할 시작 방식&lt;/h3&gt;
&lt;p data-end=&quot;2495&quot; data-start=&quot;2443&quot; data-ke-size=&quot;size16&quot;&gt;❌ 전 노드 일괄 배포&lt;br /&gt;❌ &amp;ldquo;일단 깔아보자&amp;rdquo;&lt;br /&gt;❌ Flamegraph 교육 없이 공개&lt;/p&gt;
&lt;hr data-end=&quot;2500&quot; data-start=&quot;2497&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2531&quot; data-start=&quot;2502&quot; data-ke-size=&quot;size26&quot;&gt;7️⃣ Parca 연재 전체 요약 (한 페이지)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2707&quot; data-start=&quot;2533&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2569&quot; data-start=&quot;2533&quot;&gt;Parca는 &lt;b&gt;Continuous Profiling 도구&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2607&quot; data-start=&quot;2570&quot;&gt;Push/Pull 이분법보다 &lt;b&gt;profiling 전용 구조&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2629&quot; data-start=&quot;2608&quot;&gt;eBPF + CO-RE로 운영 가능&lt;/li&gt;
&lt;li data-end=&quot;2658&quot; data-start=&quot;2630&quot;&gt;Flamegraph는 &amp;ldquo;정답&amp;rdquo;이 아니라 &amp;ldquo;지도&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;2676&quot; data-start=&quot;2659&quot;&gt;컨테이너 환경에서 특히 강력&lt;/li&gt;
&lt;li data-end=&quot;2707&quot; data-start=&quot;2677&quot;&gt;도입 실패 원인은 대부분 &lt;b&gt;기술이 아니라 기대&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2712&quot; data-start=&quot;2709&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2729&quot; data-start=&quot;2714&quot; data-ke-size=&quot;size26&quot;&gt;8️⃣ 이 연재의 결론&lt;/h2&gt;
&lt;blockquote data-end=&quot;2790&quot; data-start=&quot;2731&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2790&quot; data-start=&quot;2733&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Parca는 성능을 &amp;ldquo;보여주는&amp;rdquo; 도구가 아니라&lt;br /&gt;성능을 &amp;ldquo;설명할 수 있게 만드는&amp;rdquo; 도구다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2829&quot; data-start=&quot;2792&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2800&quot; data-start=&quot;2792&quot;&gt;숫자를 넘어&lt;/li&gt;
&lt;li data-end=&quot;2810&quot; data-start=&quot;2801&quot;&gt;그래프를 넘어&lt;/li&gt;
&lt;li data-end=&quot;2829&quot; data-start=&quot;2811&quot;&gt;&amp;ldquo;왜 그런가&amp;rdquo;에 답하게 만든다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2867&quot; data-start=&quot;2831&quot; data-ke-size=&quot;size16&quot;&gt;그 답이 필요하다면,&lt;br /&gt;Parca는 충분히 도입할 가치가 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2872&quot; data-start=&quot;2869&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2900&quot; data-start=&quot;2874&quot; data-ke-size=&quot;size26&quot;&gt;에필로그: 언제 Parca를 배우면 좋은가&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2984&quot; data-start=&quot;2902&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2920&quot; data-start=&quot;2902&quot;&gt;perf를 써봤지만 답답할 때&lt;/li&gt;
&lt;li data-end=&quot;2938&quot; data-start=&quot;2921&quot;&gt;APM이 &amp;ldquo;정상&amp;rdquo;만 말할 때&lt;/li&gt;
&lt;li data-end=&quot;2963&quot; data-start=&quot;2939&quot;&gt;Kubernetes 성능이 미스터리일 때&lt;/li&gt;
&lt;li data-end=&quot;2984&quot; data-start=&quot;2964&quot;&gt;&amp;ldquo;느리다&amp;rdquo;는 말을 증명해야 할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3016&quot; data-start=&quot;2986&quot; data-ke-size=&quot;size16&quot;&gt;그때가 바로&lt;br /&gt;&lt;b&gt;Parca를 써야 할 시점&lt;/b&gt;이다.&lt;/p&gt;</description>
      <category>Parca</category>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/12</guid>
      <comments>https://overfrost.tistory.com/12#entry12comment</comments>
      <pubDate>Sat, 20 Dec 2025 10:58:16 +0900</pubDate>
    </item>
    <item>
      <title>9편. Parca 도입 시 현실적인 고려사항&amp;ndash; 운영, 보안, 성능 관점</title>
      <link>https://overfrost.tistory.com/11</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-id=&quot;9b4a124f-930a-43a3-9469-3ad2d4c01645&quot; data-message-author-role=&quot;user&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-5-2&quot; data-message-id=&quot;b1fcf04f-b769-43b3-9beb-c4af3c6f5276&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h1 data-end=&quot;194&quot; data-start=&quot;170&quot;&gt;Parca 도입 시 현실적인 고려사항&lt;/h1&gt;
&lt;h2 data-end=&quot;211&quot; data-start=&quot;195&quot; data-ke-size=&quot;size26&quot;&gt;운영, 보안, 성능 관점&lt;/h2&gt;
&lt;p data-end=&quot;256&quot; data-start=&quot;213&quot; data-ke-size=&quot;size16&quot;&gt;Parca를 어느 정도 이해한 뒤,&lt;br /&gt;실무에서는 결국 이 질문으로 수렴한다.&lt;/p&gt;
&lt;blockquote data-end=&quot;282&quot; data-start=&quot;258&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;282&quot; data-start=&quot;260&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래서&amp;hellip; 운영 서버에 깔아도 되는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;349&quot; data-start=&quot;284&quot; data-ke-size=&quot;size16&quot;&gt;이 질문에 &lt;b&gt;정직하게 답하지 못하면&lt;/b&gt;,&lt;br /&gt;Parca는 PoC에서 멈추거나&lt;br /&gt;&amp;ldquo;위험한 도구&amp;rdquo;라는 낙인이 찍힌다.&lt;/p&gt;
&lt;p data-end=&quot;414&quot; data-start=&quot;351&quot; data-ke-size=&quot;size16&quot;&gt;이번 편에서는&lt;br /&gt;Parca 도입을 결정하기 전에 반드시 검토해야 할&lt;br /&gt;&lt;b&gt;현실적인 체크 포인트&lt;/b&gt;를 정리한다.&lt;/p&gt;
&lt;hr data-end=&quot;419&quot; data-start=&quot;416&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;445&quot; data-start=&quot;421&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ 운영 관점: 항상 켜도 되는가?&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWqWi/dJMcaf6foap/1k23j5DjcYnUlADNH4Khk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWqWi/dJMcaf6foap/1k23j5DjcYnUlADNH4Khk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWqWi/dJMcaf6foap/1k23j5DjcYnUlADNH4Khk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoWqWi%2FdJMcaf6foap%2F1k23j5DjcYnUlADNH4Khk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;630&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vMbne/dJMcaf6foao/kDtwmknxlTVrfGoJIDfN5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vMbne/dJMcaf6foao/kDtwmknxlTVrfGoJIDfN5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vMbne/dJMcaf6foao/kDtwmknxlTVrfGoJIDfN5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvMbne%2FdJMcaf6foao%2FkDtwmknxlTVrfGoJIDfN5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1107&quot; height=&quot;486&quot; data-origin-width=&quot;1107&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;505&quot; data-start=&quot;489&quot; data-ke-size=&quot;size23&quot;&gt;Parca의 기본 전제&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;566&quot; data-start=&quot;507&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;527&quot; data-start=&quot;507&quot;&gt;&lt;b&gt;상시 활성화&lt;/b&gt;를 전제로 설계&lt;/li&gt;
&lt;li data-end=&quot;544&quot; data-start=&quot;528&quot;&gt;장애 시에만 켜는 도구 ❌&lt;/li&gt;
&lt;li data-end=&quot;566&quot; data-start=&quot;545&quot;&gt;평상시 데이터를 쌓아두는 도구 ⭕️&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;600&quot; data-start=&quot;568&quot; data-ke-size=&quot;size16&quot;&gt;하지만 &amp;ldquo;설계상 가능&amp;rdquo;과 &amp;ldquo;우리 환경에서 가능&amp;rdquo;은 다르다.&lt;/p&gt;
&lt;hr data-end=&quot;605&quot; data-start=&quot;602&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;629&quot; data-start=&quot;607&quot; data-ke-size=&quot;size23&quot;&gt;운영에서 가장 중요한 질문 3가지&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;713&quot; data-start=&quot;631&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;658&quot; data-start=&quot;631&quot;&gt;agent가 죽으면 서비스에 영향이 있는가?&lt;/li&gt;
&lt;li data-end=&quot;687&quot; data-start=&quot;659&quot;&gt;server가 죽으면 서비스에 영향이 있는가?&lt;/li&gt;
&lt;li data-end=&quot;713&quot; data-start=&quot;688&quot;&gt;네트워크가 끊기면 무슨 일이 벌어지는가?&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;718&quot; data-start=&quot;715&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;733&quot; data-start=&quot;720&quot; data-ke-size=&quot;size23&quot;&gt;답은 다음과 같다&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;상황서비스 영향
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;881&quot; data-start=&quot;735&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;881&quot; data-start=&quot;761&quot;&gt;
&lt;tr data-end=&quot;786&quot; data-start=&quot;761&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;778&quot; data-start=&quot;761&quot;&gt;parca-agent 종료&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;786&quot; data-start=&quot;778&quot;&gt;❌ 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;812&quot; data-start=&quot;787&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;804&quot; data-start=&quot;787&quot;&gt;parca-agent 장애&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;812&quot; data-start=&quot;804&quot;&gt;❌ 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;839&quot; data-start=&quot;813&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;831&quot; data-start=&quot;813&quot;&gt;Parca Server 장애&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;839&quot; data-start=&quot;831&quot;&gt;❌ 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;881&quot; data-start=&quot;840&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;860&quot; data-start=&quot;840&quot;&gt;agent &amp;harr; server 단절&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;881&quot; data-start=&quot;860&quot;&gt;❌ 없음 (데이터 유실만 발생)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;916&quot; data-start=&quot;883&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Parca는 운영 서버의 &amp;lsquo;비필수 컴포넌트&amp;rsquo;다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;921&quot; data-start=&quot;918&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;938&quot; data-start=&quot;923&quot; data-ke-size=&quot;size23&quot;&gt;운영 설계 철학 요약&lt;/h3&gt;
&lt;blockquote data-end=&quot;979&quot; data-start=&quot;940&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;979&quot; data-start=&quot;942&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;관측 도구는&lt;br /&gt;관측 대상의 가용성을 위협하면 안 된다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1006&quot; data-start=&quot;981&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 이 원칙을 비교적 충실히 지킨다.&lt;/p&gt;
&lt;hr data-end=&quot;1011&quot; data-start=&quot;1008&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1040&quot; data-start=&quot;1013&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ 성능 관점: 오버헤드는 정말 낮은가?&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;727&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9fvOp/dJMcabbHMSb/EmdD7LFyVXNlXxdxHqvYFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9fvOp/dJMcabbHMSb/EmdD7LFyVXNlXxdxHqvYFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9fvOp/dJMcabbHMSb/EmdD7LFyVXNlXxdxHqvYFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9fvOp%2FdJMcabbHMSb%2FEmdD7LFyVXNlXxdxHqvYFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;727&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;727&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccamDA/dJMcab3Qwn6/c7vwx5JNshARTxlcog4uKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccamDA/dJMcab3Qwn6/c7vwx5JNshARTxlcog4uKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccamDA/dJMcab3Qwn6/c7vwx5JNshARTxlcog4uKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccamDA%2FdJMcab3Qwn6%2Fc7vwx5JNshARTxlcog4uKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;626&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1100&quot; data-start=&quot;1084&quot; data-ke-size=&quot;size23&quot;&gt;오버헤드를 만드는 요소&lt;/h3&gt;
&lt;p data-end=&quot;1132&quot; data-start=&quot;1102&quot; data-ke-size=&quot;size16&quot;&gt;Parca agent의 오버헤드는 다음 요소의 합이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1208&quot; data-start=&quot;1134&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1151&quot; data-start=&quot;1134&quot;&gt;perf_event 인터럽트&lt;/li&gt;
&lt;li data-end=&quot;1166&quot; data-start=&quot;1152&quot;&gt;eBPF 프로그램 실행&lt;/li&gt;
&lt;li data-end=&quot;1183&quot; data-start=&quot;1167&quot;&gt;stack trace 수집&lt;/li&gt;
&lt;li data-end=&quot;1198&quot; data-start=&quot;1184&quot;&gt;userspace 전달&lt;/li&gt;
&lt;li data-end=&quot;1208&quot; data-start=&quot;1199&quot;&gt;gRPC 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1213&quot; data-start=&quot;1210&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1230&quot; data-start=&quot;1215&quot; data-ke-size=&quot;size23&quot;&gt;왜 오버헤드가 낮은가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1326&quot; data-start=&quot;1232&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1244&quot; data-start=&quot;1232&quot;&gt;&lt;b&gt;샘플링 기반&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1245&quot;&gt;tracing 아님&lt;/li&gt;
&lt;li data-end=&quot;1274&quot; data-start=&quot;1258&quot;&gt;고정된 짧은 eBPF 코드&lt;/li&gt;
&lt;li data-end=&quot;1299&quot; data-start=&quot;1275&quot;&gt;낮은 기본 샘플링 빈도 (보통 19Hz)&lt;/li&gt;
&lt;li data-end=&quot;1326&quot; data-start=&quot;1300&quot;&gt;aggregation은 server에서 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1331&quot; data-start=&quot;1328&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1349&quot; data-start=&quot;1333&quot; data-ke-size=&quot;size23&quot;&gt;샘플링 빈도 조절 예시&lt;/h3&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1766195566802&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;parca-agent \
  --sampling-frequency=19 \
  --store-address=parca-server:7070&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1497&quot; data-start=&quot;1442&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1457&quot; data-start=&quot;1442&quot;&gt;19Hz &amp;rarr; 운영 기본값&lt;/li&gt;
&lt;li data-end=&quot;1473&quot; data-start=&quot;1458&quot;&gt;49Hz 이상 &amp;rarr; 분석용&lt;/li&gt;
&lt;li data-end=&quot;1497&quot; data-start=&quot;1474&quot;&gt;수백 Hz &amp;rarr; &lt;b&gt;운영에서는 비권장&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1502&quot; data-start=&quot;1499&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1518&quot; data-start=&quot;1504&quot; data-ke-size=&quot;size23&quot;&gt;실제 체감 오버헤드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1577&quot; data-start=&quot;1520&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1537&quot; data-start=&quot;1520&quot;&gt;CPU 사용량: 수 % 미만&lt;/li&gt;
&lt;li data-end=&quot;1561&quot; data-start=&quot;1538&quot;&gt;latency 영향: 대부분 측정 불가&lt;/li&gt;
&lt;li data-end=&quot;1577&quot; data-start=&quot;1562&quot;&gt;스루풋 영향: 거의 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1601&quot; data-start=&quot;1579&quot; data-ke-size=&quot;size16&quot;&gt;하지만 ⚠️ 다음 경우는 주의해야 한다.&lt;/p&gt;
&lt;hr data-end=&quot;1606&quot; data-start=&quot;1603&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1626&quot; data-start=&quot;1608&quot; data-ke-size=&quot;size23&quot;&gt;성능 리스크가 커지는 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1718&quot; data-start=&quot;1628&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1638&quot; data-start=&quot;1628&quot;&gt;초고빈도 샘플링&lt;/li&gt;
&lt;li data-end=&quot;1653&quot; data-start=&quot;1639&quot;&gt;CPU 이미 포화 상태&lt;/li&gt;
&lt;li data-end=&quot;1685&quot; data-start=&quot;1654&quot;&gt;context switch가 극단적으로 많은 워크로드&lt;/li&gt;
&lt;li data-end=&quot;1718&quot; data-start=&quot;1686&quot;&gt;RT kernel / low-latency kernel&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1766&quot; data-start=&quot;1720&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Parca는 문제를 만들기보다는&lt;br /&gt;문제가 있는 곳에서 더 잘 보인다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1771&quot; data-start=&quot;1768&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1798&quot; data-start=&quot;1773&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ 보안 관점: eBPF는 안전한가?&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VCYja/dJMcahwdXbz/8h4xGxzED9d5TEPjKWkIl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VCYja/dJMcahwdXbz/8h4xGxzED9d5TEPjKWkIl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VCYja/dJMcahwdXbz/8h4xGxzED9d5TEPjKWkIl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVCYja%2FdJMcahwdXbz%2F8h4xGxzED9d5TEPjKWkIl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1249&quot; height=&quot;658&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRhDiE/dJMb99Su6A6/86hB3IC38aMo9GHK4z3kt0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRhDiE/dJMb99Su6A6/86hB3IC38aMo9GHK4z3kt0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRhDiE/dJMb99Su6A6/86hB3IC38aMo9GHK4z3kt0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRhDiE%2FdJMb99Su6A6%2F86hB3IC38aMo9GHK4z3kt0%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;646&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1856&quot; data-start=&quot;1842&quot; data-ke-size=&quot;size16&quot;&gt;이 질문은 반드시 나온다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1896&quot; data-start=&quot;1858&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1896&quot; data-start=&quot;1860&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;eBPF는 커널에 코드를 올리잖아요.&lt;br /&gt;보안상 괜찮나요?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1901&quot; data-start=&quot;1898&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1917&quot; data-start=&quot;1903&quot; data-ke-size=&quot;size23&quot;&gt;eBPF의 안전장치&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2004&quot; data-start=&quot;1919&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1970&quot; data-start=&quot;1919&quot;&gt;verifier:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1970&quot; data-start=&quot;1933&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1943&quot; data-start=&quot;1933&quot;&gt;무한 루프 금지&lt;/li&gt;
&lt;li data-end=&quot;1957&quot; data-start=&quot;1946&quot;&gt;메모리 접근 제한&lt;/li&gt;
&lt;li data-end=&quot;1970&quot; data-start=&quot;1960&quot;&gt;스택 크기 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1986&quot; data-start=&quot;1971&quot;&gt;helper API 제한&lt;/li&gt;
&lt;li data-end=&quot;2004&quot; data-start=&quot;1987&quot;&gt;권한 없는 사용자 로딩 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2024&quot; data-start=&quot;2006&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 이 위에서 동작한다.&lt;/p&gt;
&lt;hr data-end=&quot;2029&quot; data-start=&quot;2026&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2045&quot; data-start=&quot;2031&quot; data-ke-size=&quot;size23&quot;&gt;요구 권한 (중요)&lt;/h3&gt;
&lt;p data-end=&quot;2075&quot; data-start=&quot;2047&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent는 보통 다음 권한이 필요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2124&quot; data-start=&quot;2077&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2086&quot; data-start=&quot;2077&quot;&gt;CAP_BPF&lt;/li&gt;
&lt;li data-end=&quot;2100&quot; data-start=&quot;2087&quot;&gt;CAP_PERFMON&lt;/li&gt;
&lt;li data-end=&quot;2124&quot; data-start=&quot;2101&quot;&gt;(일부 환경) CAP_SYS_ADMIN&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2143&quot; data-start=&quot;2126&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes에서는 흔히:(yaml)&lt;/p&gt;
&lt;pre id=&quot;code_1766195619585&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;securityContext:
  privileged: true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2201&quot; data-start=&quot;2194&quot; data-ke-size=&quot;size16&quot;&gt;를 사용한다.&lt;/p&gt;
&lt;hr data-end=&quot;2206&quot; data-start=&quot;2203&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2228&quot; data-start=&quot;2208&quot; data-ke-size=&quot;size23&quot;&gt;보안팀이 가장 싫어하는 포인트&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2273&quot; data-start=&quot;2230&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2252&quot; data-start=&quot;2230&quot;&gt;privileged container&lt;/li&gt;
&lt;li data-end=&quot;2265&quot; data-start=&quot;2253&quot;&gt;hostPID 사용&lt;/li&gt;
&lt;li data-end=&quot;2273&quot; data-start=&quot;2266&quot;&gt;커널 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2306&quot; data-start=&quot;2275&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;이건 기술 문제가 아니라 조직 정책 문제다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;2311&quot; data-start=&quot;2308&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2327&quot; data-start=&quot;2313&quot; data-ke-size=&quot;size23&quot;&gt;현실적인 대응 전략&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2433&quot; data-start=&quot;2329&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2386&quot; data-start=&quot;2329&quot;&gt;Parca agent는:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2386&quot; data-start=&quot;2347&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2354&quot; data-start=&quot;2347&quot;&gt;노드 전용&lt;/li&gt;
&lt;li data-end=&quot;2372&quot; data-start=&quot;2357&quot;&gt;접근 통제된 네임스페이스&lt;/li&gt;
&lt;li data-end=&quot;2386&quot; data-start=&quot;2375&quot;&gt;외부 통신 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;2413&quot; data-start=&quot;2387&quot;&gt;RBAC / NetworkPolicy로 제어&lt;/li&gt;
&lt;li data-end=&quot;2433&quot; data-start=&quot;2414&quot;&gt;Server 접근도 내부망 한정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2438&quot; data-start=&quot;2435&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2463&quot; data-start=&quot;2440&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ 스토리지 관점: 생각보다 크다&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dj4Ctw/dJMcadAxD7a/4KifKUKeXsUnkrvjA4zwjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dj4Ctw/dJMcadAxD7a/4KifKUKeXsUnkrvjA4zwjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dj4Ctw/dJMcadAxD7a/4KifKUKeXsUnkrvjA4zwjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdj4Ctw%2FdJMcadAxD7a%2F4KifKUKeXsUnkrvjA4zwjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;783&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;783&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLUHy3/dJMcadAxD7b/PyeSncN2pmoajKceaS4Jtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLUHy3/dJMcadAxD7b/PyeSncN2pmoajKceaS4Jtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLUHy3/dJMcadAxD7b/PyeSncN2pmoajKceaS4Jtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLUHy3%2FdJMcadAxD7b%2FPyeSncN2pmoajKceaS4Jtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;683&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2521&quot; data-start=&quot;2507&quot; data-ke-size=&quot;size16&quot;&gt;많이들 간과하는 부분이다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2547&quot; data-start=&quot;2523&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2547&quot; data-start=&quot;2525&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로파일 데이터는 생각보다 크다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2552&quot; data-start=&quot;2549&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2572&quot; data-start=&quot;2554&quot; data-ke-size=&quot;size23&quot;&gt;왜 스토리지를 많이 쓰는가&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2628&quot; data-start=&quot;2574&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2583&quot; data-start=&quot;2574&quot;&gt;단순 수치 ❌&lt;/li&gt;
&lt;li data-end=&quot;2602&quot; data-start=&quot;2584&quot;&gt;call stack 트리 ⭕️&lt;/li&gt;
&lt;li data-end=&quot;2615&quot; data-start=&quot;2603&quot;&gt;시간 축 누적 ⭕️&lt;/li&gt;
&lt;li data-end=&quot;2628&quot; data-start=&quot;2616&quot;&gt;diff 비교 ⭕️&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2633&quot; data-start=&quot;2630&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2647&quot; data-start=&quot;2635&quot; data-ke-size=&quot;size23&quot;&gt;실무 기준 조언&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2694&quot; data-start=&quot;2649&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2658&quot; data-start=&quot;2649&quot;&gt;장기 보존 ❌&lt;/li&gt;
&lt;li data-end=&quot;2672&quot; data-start=&quot;2659&quot;&gt;최근 며칠~수주 ⭕️&lt;/li&gt;
&lt;li data-end=&quot;2694&quot; data-start=&quot;2673&quot;&gt;&amp;ldquo;항상 6개월치&amp;rdquo; 같은 목표는 위험&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2712&quot; data-start=&quot;2696&quot; data-ke-size=&quot;size16&quot;&gt;보존 전략은 반드시 필요하다.&lt;/p&gt;
&lt;hr data-end=&quot;2717&quot; data-start=&quot;2714&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2739&quot; data-start=&quot;2719&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ 언제 켜고, 언제 끄는가&lt;/h2&gt;
&lt;h3 data-end=&quot;2758&quot; data-start=&quot;2741&quot; data-ke-size=&quot;size23&quot;&gt;항상 켜 두기 좋은 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2823&quot; data-start=&quot;2760&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2771&quot; data-start=&quot;2760&quot;&gt;성능 민감 서비스&lt;/li&gt;
&lt;li data-end=&quot;2790&quot; data-start=&quot;2772&quot;&gt;커널/네이티브 코드 비중 높음&lt;/li&gt;
&lt;li data-end=&quot;2805&quot; data-start=&quot;2791&quot;&gt;재현 어려운 문제 잦음&lt;/li&gt;
&lt;li data-end=&quot;2823&quot; data-start=&quot;2806&quot;&gt;플랫폼/SRE 팀 관리 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2828&quot; data-start=&quot;2825&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2850&quot; data-start=&quot;2830&quot; data-ke-size=&quot;size23&quot;&gt;상시 활성화가 부담스러운 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2900&quot; data-start=&quot;2852&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2863&quot; data-start=&quot;2852&quot;&gt;CPU 이미 포화&lt;/li&gt;
&lt;li data-end=&quot;2874&quot; data-start=&quot;2864&quot;&gt;커널 변경 불가&lt;/li&gt;
&lt;li data-end=&quot;2888&quot; data-start=&quot;2875&quot;&gt;보안 정책 매우 엄격&lt;/li&gt;
&lt;li data-end=&quot;2900&quot; data-start=&quot;2889&quot;&gt;단발성 분석 목적&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2934&quot; data-start=&quot;2902&quot; data-ke-size=&quot;size16&quot;&gt;  이 경우는 &lt;b&gt;필요 시 단기 활성화&lt;/b&gt;가 현실적이다.&lt;/p&gt;
&lt;hr data-end=&quot;2939&quot; data-start=&quot;2936&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2967&quot; data-start=&quot;2941&quot; data-ke-size=&quot;size26&quot;&gt;6️⃣ Parca를 도입하면 안 되는 경우&lt;/h2&gt;
&lt;p data-end=&quot;2983&quot; data-start=&quot;2969&quot; data-ke-size=&quot;size16&quot;&gt;이건 명확히 말해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;3079&quot; data-start=&quot;2985&quot; data-ke-size=&quot;size16&quot;&gt;❌ 반드시 모든 샘플을 보존해야 하는 환경&lt;br /&gt;❌ 규제/감사 목적의 포렌식 시스템&lt;br /&gt;❌ 커널 접근이 원천적으로 불가능한 환경&lt;br /&gt;❌ &amp;ldquo;APM 대체&amp;rdquo;를 기대하는 경우&lt;/p&gt;
&lt;p data-end=&quot;3107&quot; data-start=&quot;3081&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 &lt;b&gt;정밀 포렌식 도구가 아니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3112&quot; data-start=&quot;3109&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3136&quot; data-start=&quot;3114&quot; data-ke-size=&quot;size26&quot;&gt;7️⃣ 도입 전 체크리스트 (요약)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3279&quot; data-start=&quot;3138&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3156&quot; data-start=&quot;3138&quot;&gt;커널 BTF 지원 여부&lt;/li&gt;
&lt;li data-end=&quot;3176&quot; data-start=&quot;3157&quot;&gt;eBPF 사용 정책 검토&lt;/li&gt;
&lt;li data-end=&quot;3200&quot; data-start=&quot;3177&quot;&gt;agent 권한 승인 가능 여부&lt;/li&gt;
&lt;li data-end=&quot;3229&quot; data-start=&quot;3201&quot;&gt;네트워크 단절 시 데이터 유실 허용 여부&lt;/li&gt;
&lt;li data-end=&quot;3246&quot; data-start=&quot;3230&quot;&gt;스토리지 보존 정책&lt;/li&gt;
&lt;li data-end=&quot;3279&quot; data-start=&quot;3247&quot;&gt;&amp;ldquo;대체&amp;rdquo;가 아니라 &amp;ldquo;보완&amp;rdquo;임을 조직이 이해하는가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3284&quot; data-start=&quot;3281&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3296&quot; data-start=&quot;3286&quot; data-ke-size=&quot;size26&quot;&gt;이 편의 결론&lt;/h2&gt;
&lt;blockquote data-end=&quot;3348&quot; data-start=&quot;3298&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3348&quot; data-start=&quot;3300&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Parca는 기술적으로 훌륭하지만,&lt;br /&gt;조직적으로 준비되지 않으면 실패한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3423&quot; data-start=&quot;3350&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3362&quot; data-start=&quot;3350&quot;&gt;성능: 대부분 안전&lt;/li&gt;
&lt;li data-end=&quot;3375&quot; data-start=&quot;3363&quot;&gt;안정성: 매우 높음&lt;/li&gt;
&lt;li data-end=&quot;3393&quot; data-start=&quot;3376&quot;&gt;보안: 기술보다 정책이 관건&lt;/li&gt;
&lt;li data-end=&quot;3423&quot; data-start=&quot;3394&quot;&gt;운영: &amp;ldquo;항상 켜두는 관측&amp;rdquo;이라는 사고 전환 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3428&quot; data-start=&quot;3425&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3446&quot; data-start=&quot;3430&quot; data-ke-size=&quot;size26&quot;&gt;다음 편 (마지막) 예고&lt;/h2&gt;
&lt;p data-end=&quot;3473&quot; data-start=&quot;3448&quot; data-ke-size=&quot;size16&quot;&gt;연재의 마지막 편에서는&lt;br /&gt;이 질문에 답한다.&lt;/p&gt;
&lt;blockquote data-end=&quot;3508&quot; data-start=&quot;3475&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3508&quot; data-start=&quot;3477&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;그래서 Parca는 누구에게 필요한 도구인가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;3513&quot; data-start=&quot;3510&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3525&quot; data-start=&quot;3515&quot; data-ke-size=&quot;size23&quot;&gt;다음 편&lt;/h3&gt;
&lt;p data-end=&quot;3572&quot; data-start=&quot;3526&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;10편. Parca는 누구에게 필요한 도구인가 &amp;ndash; 도입 판단 가이드 &amp;amp; 정리&lt;/b&gt;&lt;/p&gt;</description>
      <category>Parca</category>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/11</guid>
      <comments>https://overfrost.tistory.com/11#entry11comment</comments>
      <pubDate>Sat, 20 Dec 2025 10:55:25 +0900</pubDate>
    </item>
    <item>
      <title>8편. CO-RE와 Parca &amp;ndash; 커널 의존성 문제는 어떻게 해결되는가</title>
      <link>https://overfrost.tistory.com/10</link>
      <description>&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-5-2&quot; data-message-id=&quot;03d25067-0291-4a82-847d-8e2a78695b90&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-end=&quot;92&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;아래는 &lt;b&gt;8편 전체 본문 확장판 초안&lt;/b&gt;입니다.&lt;br /&gt;이번 편은 &lt;b&gt;Parca가 &amp;ldquo;운영 환경에서도 안전하게 eBPF를 쓰는 이유&amp;rdquo;를 설명하는 핵심 이론 편&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;196&quot; data-start=&quot;94&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;116&quot; data-start=&quot;94&quot;&gt;왜 eBPF가 커널 버전에 취약했는지&lt;/li&gt;
&lt;li data-end=&quot;135&quot; data-start=&quot;117&quot;&gt;CO-RE가 무엇을 해결했는지&lt;/li&gt;
&lt;li data-end=&quot;171&quot; data-start=&quot;136&quot;&gt;Parca / parca-agent가 이를 어떻게 활용하는지&lt;/li&gt;
&lt;li data-end=&quot;196&quot; data-start=&quot;172&quot;&gt;실무자가 반드시 알아야 할 한계까지 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;201&quot; data-start=&quot;198&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;219&quot; data-start=&quot;203&quot;&gt;CO-RE와 Parca&lt;/h1&gt;
&lt;h2 data-end=&quot;243&quot; data-start=&quot;220&quot; data-ke-size=&quot;size26&quot;&gt;커널 의존성 문제는 어떻게 해결되는가&lt;/h2&gt;
&lt;p data-end=&quot;282&quot; data-start=&quot;245&quot; data-ke-size=&quot;size16&quot;&gt;eBPF를 공부하다 보면&lt;br /&gt;반드시 한 번은 이런 말을 듣게 된다.&lt;/p&gt;
&lt;blockquote data-end=&quot;322&quot; data-start=&quot;284&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;322&quot; data-start=&quot;286&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;eBPF는 좋은데,&lt;br /&gt;커널 버전 맞추는 게 너무 힘들다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;415&quot; data-start=&quot;324&quot; data-ke-size=&quot;size16&quot;&gt;이 말은 &lt;b&gt;과거에는 사실&lt;/b&gt;이었다.&lt;br /&gt;그리고 CO-RE(Compile Once &amp;ndash; Run Everywhere)는&lt;br /&gt;이 문제를 정면으로 해결하기 위해 등장했다.&lt;/p&gt;
&lt;p data-end=&quot;470&quot; data-start=&quot;417&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 바로 이 CO-RE 위에 설계된&lt;br /&gt;&lt;b&gt;운영 환경 친화적 eBPF 프로파일러&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-end=&quot;475&quot; data-start=&quot;472&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;504&quot; data-start=&quot;477&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ eBPF의 오래된 문제: 커널 의존성&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwL8y7/dJMcaiaPE3G/vp1R8Em4VhzlFl5qZydmFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwL8y7/dJMcaiaPE3G/vp1R8Em4VhzlFl5qZydmFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwL8y7/dJMcaiaPE3G/vp1R8Em4VhzlFl5qZydmFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwL8y7%2FdJMcaiaPE3G%2Fvp1R8Em4VhzlFl5qZydmFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1249&quot; height=&quot;658&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;1615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtCEoF/dJMcaiaPE3H/dbB1JU8B4Q0cu0GxTOxv5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtCEoF/dJMcaiaPE3H/dbB1JU8B4Q0cu0GxTOxv5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtCEoF/dJMcaiaPE3H/dbB1JU8B4Q0cu0GxTOxv5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtCEoF%2FdJMcaiaPE3H%2FdbB1JU8B4Q0cu0GxTOxv5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2880&quot; height=&quot;1615&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;1615&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;975&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6z7zV/dJMcadtMsDI/CjhZnzBmg9LeBejIzb3Hck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6z7zV/dJMcadtMsDI/CjhZnzBmg9LeBejIzb3Hck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6z7zV/dJMcadtMsDI/CjhZnzBmg9LeBejIzb3Hck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6z7zV%2FdJMcadtMsDI%2FCjhZnzBmg9LeBejIzb3Hck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1361&quot; height=&quot;975&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;975&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;577&quot; data-start=&quot;548&quot; data-ke-size=&quot;size16&quot;&gt;초기의 eBPF 프로그램은 다음 문제를 안고 있었다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;680&quot; data-start=&quot;579&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;604&quot; data-start=&quot;579&quot;&gt;커널 버전마다 struct 레이아웃이 다름&lt;/li&gt;
&lt;li data-end=&quot;625&quot; data-start=&quot;605&quot;&gt;배포판마다 config 옵션 상이&lt;/li&gt;
&lt;li data-end=&quot;656&quot; data-start=&quot;626&quot;&gt;minor version 차이에도 offset 변경&lt;/li&gt;
&lt;li data-end=&quot;680&quot; data-start=&quot;657&quot;&gt;커널 업데이트 시 프로그램 재빌드 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;684&quot; data-start=&quot;682&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;736&quot; data-start=&quot;686&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;736&quot; data-start=&quot;688&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;이 서버에서는 잘 되는데,&lt;br /&gt;저 서버에서는 verifier에서 터진다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;763&quot; data-start=&quot;738&quot; data-ke-size=&quot;size16&quot;&gt;운영 환경에서는 거의 재앙에 가까운 문제였다.&lt;/p&gt;
&lt;hr data-end=&quot;768&quot; data-start=&quot;765&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;789&quot; data-start=&quot;770&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ 전통적인 해결책의 한계&lt;/h2&gt;
&lt;p data-end=&quot;815&quot; data-start=&quot;791&quot; data-ke-size=&quot;size16&quot;&gt;CO-RE 이전에는 보통 이런 방법을 썼다.&lt;/p&gt;
&lt;h3 data-end=&quot;832&quot; data-start=&quot;817&quot; data-ke-size=&quot;size23&quot;&gt;① 커널 버전별 빌드&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;879&quot; data-start=&quot;834&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;847&quot; data-start=&quot;834&quot;&gt;kernel 5.4용&lt;/li&gt;
&lt;li data-end=&quot;862&quot; data-start=&quot;848&quot;&gt;kernel 5.10용&lt;/li&gt;
&lt;li data-end=&quot;879&quot; data-start=&quot;863&quot;&gt;kernel 5.15용 &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;894&quot; data-start=&quot;881&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현실적으로 관리 불가&lt;/p&gt;
&lt;hr data-end=&quot;899&quot; data-start=&quot;896&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;920&quot; data-start=&quot;901&quot; data-ke-size=&quot;size23&quot;&gt;② 런타임 offset 추정&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;969&quot; data-start=&quot;922&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;937&quot; data-start=&quot;922&quot;&gt;kprobe로 주소 추적&lt;/li&gt;
&lt;li data-end=&quot;953&quot; data-start=&quot;938&quot;&gt;fragile한 휴리스틱&lt;/li&gt;
&lt;li data-end=&quot;969&quot; data-start=&quot;954&quot;&gt;커널 패치 하나에 무너짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;980&quot; data-start=&quot;971&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 유지보수 지옥&lt;/p&gt;
&lt;hr data-end=&quot;985&quot; data-start=&quot;982&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1005&quot; data-start=&quot;987&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ CO-RE란 무엇인가&lt;/h2&gt;
&lt;p data-end=&quot;1022&quot; data-start=&quot;1007&quot; data-ke-size=&quot;size16&quot;&gt;CO-RE는 이름 그대로다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1058&quot; data-start=&quot;1024&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1058&quot; data-start=&quot;1026&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Compile Once, Run Everywhere&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1074&quot; data-start=&quot;1060&quot; data-ke-size=&quot;size16&quot;&gt;핵심 아이디어는 단순하다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1116&quot; data-start=&quot;1076&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1116&quot; data-start=&quot;1078&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;컴파일 시점이 아니라,&lt;br /&gt;로드 시점에 커널 구조체에 맞춘다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1145&quot; data-start=&quot;1118&quot; data-ke-size=&quot;size16&quot;&gt;이를 가능하게 하는 핵심 기술이 &lt;b&gt;BTF&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-end=&quot;1150&quot; data-start=&quot;1147&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1180&quot; data-start=&quot;1152&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ BTF (BPF Type Format)&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;1615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r5nep/dJMcadUQp6R/eV1Bgdv1W7sun8mQyYd7l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r5nep/dJMcadUQp6R/eV1Bgdv1W7sun8mQyYd7l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r5nep/dJMcadUQp6R/eV1Bgdv1W7sun8mQyYd7l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr5nep%2FdJMcadUQp6R%2FeV1Bgdv1W7sun8mQyYd7l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2880&quot; height=&quot;1615&quot; data-origin-width=&quot;2880&quot; data-origin-height=&quot;1615&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm9Vbt/dJMcab3QwiH/cY2zemgstgeVl6Pzat3D2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm9Vbt/dJMcab3QwiH/cY2zemgstgeVl6Pzat3D2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm9Vbt/dJMcab3QwiH/cY2zemgstgeVl6Pzat3D2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm9Vbt%2FdJMcab3QwiH%2FcY2zemgstgeVl6Pzat3D2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;711&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/23OEP/dJMcadUQp6T/iheW9oYMZfsKP3wMxgEWSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/23OEP/dJMcadUQp6T/iheW9oYMZfsKP3wMxgEWSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/23OEP/dJMcadUQp6T/iheW9oYMZfsKP3wMxgEWSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F23OEP%2FdJMcadUQp6T%2FiheW9oYMZfsKP3wMxgEWSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;402&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1238&quot; data-start=&quot;1224&quot; data-ke-size=&quot;size16&quot;&gt;BTF는 다음을 제공한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1282&quot; data-start=&quot;1240&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1240&quot;&gt;커널 내부 struct 정의&lt;/li&gt;
&lt;li data-end=&quot;1265&quot; data-start=&quot;1258&quot;&gt;필드 이름&lt;/li&gt;
&lt;li data-end=&quot;1273&quot; data-start=&quot;1266&quot;&gt;타입 정보&lt;/li&gt;
&lt;li data-end=&quot;1282&quot; data-start=&quot;1274&quot;&gt;오프셋 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1290&quot; data-start=&quot;1284&quot; data-ke-size=&quot;size16&quot;&gt;이 정보는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1336&quot; data-start=&quot;1292&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1304&quot; data-start=&quot;1292&quot;&gt;커널 빌드 시 생성&lt;/li&gt;
&lt;li data-end=&quot;1336&quot; data-start=&quot;1305&quot;&gt;/sys/kernel/btf/vmlinux에 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1340&quot; data-start=&quot;1338&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;1373&quot; data-start=&quot;1342&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1373&quot; data-start=&quot;1344&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;커널이 스스로 자기 타입 정보를 제공한다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1378&quot; data-start=&quot;1375&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1399&quot; data-start=&quot;1380&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ CO-RE의 동작 원리&lt;/h2&gt;
&lt;p data-end=&quot;1430&quot; data-start=&quot;1401&quot; data-ke-size=&quot;size16&quot;&gt;CO-RE eBPF 프로그램은 다음과 같이 동작한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1561&quot; data-start=&quot;1432&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1466&quot; data-start=&quot;1432&quot;&gt;eBPF object는 &lt;b&gt;논리적 필드 접근&lt;/b&gt;으로 작성&lt;/li&gt;
&lt;li data-end=&quot;1519&quot; data-start=&quot;1467&quot;&gt;로드 시:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1519&quot; data-start=&quot;1479&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1494&quot; data-start=&quot;1479&quot;&gt;커널의 BTF 정보 로드&lt;/li&gt;
&lt;li data-end=&quot;1519&quot; data-start=&quot;1498&quot;&gt;실제 struct layout 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1561&quot; data-start=&quot;1520&quot;&gt;필드 접근을 &lt;b&gt;실제 offset으로 재배치(relocation)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1566&quot; data-start=&quot;1563&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1587&quot; data-start=&quot;1568&quot; data-ke-size=&quot;size23&quot;&gt;CO-RE 스타일 코드 예시&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1766195378670&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct task_struct *task = (struct task_struct *)bpf_get_current_task();

/* CO-RE field access */
u32 pid = BPF_CORE_READ(task, pid);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1740&quot; data-start=&quot;1734&quot; data-ke-size=&quot;size16&quot;&gt;이 코드는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1781&quot; data-start=&quot;1742&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1754&quot; data-start=&quot;1742&quot;&gt;kernel 5.4&lt;/li&gt;
&lt;li data-end=&quot;1768&quot; data-start=&quot;1755&quot;&gt;kernel 5.10&lt;/li&gt;
&lt;li data-end=&quot;1781&quot; data-start=&quot;1769&quot;&gt;kernel 6.x&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1806&quot; data-start=&quot;1783&quot; data-ke-size=&quot;size16&quot;&gt;모두에서 &lt;b&gt;같은 바이너리로 동작&lt;/b&gt;한다.&lt;/p&gt;
&lt;hr data-end=&quot;1811&quot; data-start=&quot;1808&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1833&quot; data-start=&quot;1813&quot; data-ke-size=&quot;size23&quot;&gt;CO-RE 이전 코드 (위험)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1766195396271&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;u32 pid = task-&amp;gt;pid;  /* offset 고정 가정 */&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1903&quot; data-start=&quot;1886&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 커널이 바뀌면 바로 깨진다.&lt;/p&gt;
&lt;hr data-end=&quot;1908&quot; data-start=&quot;1905&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1938&quot; data-start=&quot;1910&quot; data-ke-size=&quot;size26&quot;&gt;6️⃣ Parca에서 CO-RE가 중요한 이유&lt;/h2&gt;
&lt;p data-end=&quot;1958&quot; data-start=&quot;1940&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 다음 특성을 가진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2011&quot; data-start=&quot;1960&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1969&quot; data-start=&quot;1960&quot;&gt;노드 수 많음&lt;/li&gt;
&lt;li data-end=&quot;1981&quot; data-start=&quot;1970&quot;&gt;커널 버전 제각각&lt;/li&gt;
&lt;li data-end=&quot;1997&quot; data-start=&quot;1982&quot;&gt;Kubernetes 환경&lt;/li&gt;
&lt;li data-end=&quot;2011&quot; data-start=&quot;1998&quot;&gt;빈번한 커널 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2020&quot; data-start=&quot;2013&quot; data-ke-size=&quot;size16&quot;&gt;이 상황에서:&lt;/p&gt;
&lt;blockquote data-end=&quot;2063&quot; data-start=&quot;2022&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2063&quot; data-start=&quot;2024&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;노드마다 agent를 다시 빌드한다&amp;rdquo;&lt;/b&gt;&lt;br /&gt;&amp;rarr; 사실상 불가능&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2068&quot; data-start=&quot;2065&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2083&quot; data-start=&quot;2070&quot; data-ke-size=&quot;size23&quot;&gt;Parca의 선택&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2187&quot; data-start=&quot;2085&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2117&quot; data-start=&quot;2085&quot;&gt;parca-agent는 &lt;b&gt;CO-RE 기반 eBPF&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2187&quot; data-start=&quot;2118&quot;&gt;하나의 바이너리로:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2187&quot; data-start=&quot;2133&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2141&quot; data-start=&quot;2133&quot;&gt;Ubuntu&lt;/li&gt;
&lt;li data-end=&quot;2150&quot; data-start=&quot;2144&quot;&gt;RHEL&lt;/li&gt;
&lt;li data-end=&quot;2167&quot; data-start=&quot;2153&quot;&gt;Amazon Linux&lt;/li&gt;
&lt;li data-end=&quot;2187&quot; data-start=&quot;2170&quot;&gt;GKE / EKS / AKS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2194&quot; data-start=&quot;2189&quot; data-ke-size=&quot;size16&quot;&gt;에서 동작&lt;/p&gt;
&lt;p data-end=&quot;2219&quot; data-start=&quot;2196&quot; data-ke-size=&quot;size16&quot;&gt;이게 바로 &lt;b&gt;운영 가능성의 핵심&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;2224&quot; data-start=&quot;2221&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2260&quot; data-start=&quot;2226&quot; data-ke-size=&quot;size26&quot;&gt;7️⃣ CO-RE가 해결하는 것 vs 해결하지 못하는 것&lt;/h2&gt;
&lt;h3 data-end=&quot;2272&quot; data-start=&quot;2262&quot; data-ke-size=&quot;size23&quot;&gt;해결하는 것&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2350&quot; data-start=&quot;2274&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2292&quot; data-start=&quot;2274&quot;&gt;struct layout 변경&lt;/li&gt;
&lt;li data-end=&quot;2307&quot; data-start=&quot;2293&quot;&gt;필드 offset 차이&lt;/li&gt;
&lt;li data-end=&quot;2329&quot; data-start=&quot;2308&quot;&gt;커널 minor version 차이&lt;/li&gt;
&lt;li data-end=&quot;2350&quot; data-start=&quot;2330&quot;&gt;배포판 간 config 차이 일부&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2355&quot; data-start=&quot;2352&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2371&quot; data-start=&quot;2357&quot; data-ke-size=&quot;size23&quot;&gt;해결하지 못하는 것&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2447&quot; data-start=&quot;2373&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2385&quot; data-start=&quot;2373&quot;&gt;BTF가 없는 커널&lt;/li&gt;
&lt;li data-end=&quot;2406&quot; data-start=&quot;2386&quot;&gt;너무 오래된 커널 (4.x 초반)&lt;/li&gt;
&lt;li data-end=&quot;2430&quot; data-start=&quot;2407&quot;&gt;eBPF helper 자체가 없는 경우&lt;/li&gt;
&lt;li data-end=&quot;2447&quot; data-start=&quot;2431&quot;&gt;verifier 정책 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2451&quot; data-start=&quot;2449&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;2496&quot; data-start=&quot;2453&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2496&quot; data-start=&quot;2455&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CO-RE는 &amp;ldquo;만능&amp;rdquo;이 아니라&lt;br /&gt;&amp;ldquo;운영 가능성의 기준선&amp;rdquo;이다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2501&quot; data-start=&quot;2498&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2536&quot; data-start=&quot;2503&quot; data-ke-size=&quot;size26&quot;&gt;8️⃣ Parca 운영 시 CO-RE 관련 체크 포인트&lt;/h2&gt;
&lt;h3 data-end=&quot;2551&quot; data-start=&quot;2538&quot; data-ke-size=&quot;size23&quot;&gt;반드시 확인할 것&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2654&quot; data-start=&quot;2553&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2586&quot; data-start=&quot;2553&quot;&gt;/sys/kernel/btf/vmlinux 존재 여부&lt;/li&gt;
&lt;li data-end=&quot;2618&quot; data-start=&quot;2587&quot;&gt;커널이 CONFIG_DEBUG_INFO_BTF 활성화&lt;/li&gt;
&lt;li data-end=&quot;2654&quot; data-start=&quot;2619&quot;&gt;parca-agent 로그에 CO-RE fallback 여부&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2659&quot; data-start=&quot;2656&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2677&quot; data-start=&quot;2661&quot; data-ke-size=&quot;size23&quot;&gt;실패 시 나타나는 증상&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2744&quot; data-start=&quot;2679&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2692&quot; data-start=&quot;2679&quot;&gt;agent 기동 실패&lt;/li&gt;
&lt;li data-end=&quot;2710&quot; data-start=&quot;2693&quot;&gt;verifier reject&lt;/li&gt;
&lt;li data-end=&quot;2744&quot; data-start=&quot;2711&quot;&gt;&amp;ldquo;failed to load BPF program&amp;rdquo; 로그&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2751&quot; data-start=&quot;2746&quot; data-ke-size=&quot;size16&quot;&gt;이 경우:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2783&quot; data-start=&quot;2753&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2763&quot; data-start=&quot;2753&quot;&gt;커널 업그레이드&lt;/li&gt;
&lt;li data-end=&quot;2783&quot; data-start=&quot;2764&quot;&gt;BTF-enabled 커널 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2795&quot; data-start=&quot;2785&quot; data-ke-size=&quot;size16&quot;&gt;외에는 답이 없다.&lt;/p&gt;
&lt;hr data-end=&quot;2800&quot; data-start=&quot;2797&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2828&quot; data-start=&quot;2802&quot; data-ke-size=&quot;size26&quot;&gt;9️⃣ 왜 CO-RE가 &amp;ldquo;게임 체인저&amp;rdquo;인가&lt;/h2&gt;
&lt;p data-end=&quot;2839&quot; data-start=&quot;2830&quot; data-ke-size=&quot;size16&quot;&gt;CO-RE 이전:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2870&quot; data-start=&quot;2841&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2857&quot; data-start=&quot;2841&quot;&gt;eBPF는 전문가의 장난감&lt;/li&gt;
&lt;li data-end=&quot;2870&quot; data-start=&quot;2858&quot;&gt;운영 투입 부담 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2881&quot; data-start=&quot;2872&quot; data-ke-size=&quot;size16&quot;&gt;CO-RE 이후:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2914&quot; data-start=&quot;2883&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2897&quot; data-start=&quot;2883&quot;&gt;eBPF는 인프라 도구&lt;/li&gt;
&lt;li data-end=&quot;2914&quot; data-start=&quot;2898&quot;&gt;Parca 같은 제품 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;2968&quot; data-start=&quot;2916&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2968&quot; data-start=&quot;2918&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CO-RE는 eBPF를&lt;br /&gt;&amp;ldquo;데모 기술&amp;rdquo;에서&lt;br /&gt;&amp;ldquo;운영 기술&amp;rdquo;로 끌어올렸다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2973&quot; data-start=&quot;2970&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2993&quot; data-start=&quot;2975&quot; data-ke-size=&quot;size26&quot;&gt;10️⃣ 이 편의 핵심 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3087&quot; data-start=&quot;2995&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3016&quot; data-start=&quot;2995&quot;&gt;eBPF의 최대 약점은 커널 의존성&lt;/li&gt;
&lt;li data-end=&quot;3037&quot; data-start=&quot;3017&quot;&gt;CO-RE + BTF가 이를 해결&lt;/li&gt;
&lt;li data-end=&quot;3062&quot; data-start=&quot;3038&quot;&gt;Parca는 CO-RE 없이는 성립 불가&lt;/li&gt;
&lt;li data-end=&quot;3087&quot; data-start=&quot;3063&quot;&gt;운영 환경에서 Parca가 안정적인 이유&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3092&quot; data-start=&quot;3089&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3104&quot; data-start=&quot;3094&quot; data-ke-size=&quot;size26&quot;&gt;다음 편 예고&lt;/h2&gt;
&lt;p data-end=&quot;3145&quot; data-start=&quot;3106&quot; data-ke-size=&quot;size16&quot;&gt;다음 편에서는&lt;br /&gt;Parca 도입 시 &lt;b&gt;현실적인 고민들&lt;/b&gt;을 다룬다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3192&quot; data-start=&quot;3147&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3153&quot; data-start=&quot;3147&quot;&gt;오버헤드&lt;/li&gt;
&lt;li data-end=&quot;3158&quot; data-start=&quot;3154&quot;&gt;보안&lt;/li&gt;
&lt;li data-end=&quot;3177&quot; data-start=&quot;3159&quot;&gt;언제 켜야 하고, 언제 끄는가&lt;/li&gt;
&lt;li data-end=&quot;3192&quot; data-start=&quot;3178&quot;&gt;도입하면 안 되는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3197&quot; data-start=&quot;3194&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3209&quot; data-start=&quot;3199&quot; data-ke-size=&quot;size23&quot;&gt;다음 편&lt;/h3&gt;
&lt;p data-end=&quot;3254&quot; data-start=&quot;3210&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9편. Parca 도입 시 현실적인 고려사항 &amp;ndash; 운영, 보안, 성능 관점&lt;/b&gt;&lt;/p&gt;</description>
      <category>Parca</category>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/10</guid>
      <comments>https://overfrost.tistory.com/10#entry10comment</comments>
      <pubDate>Sat, 20 Dec 2025 10:50:44 +0900</pubDate>
    </item>
    <item>
      <title>7편. 컨테이너&amp;middot;Kubernetes 환경에서의 Parca&amp;ndash; PID, Namespace, cgroup 관점</title>
      <link>https://overfrost.tistory.com/9</link>
      <description>&lt;p data-end=&quot;86&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;아래는 &lt;b&gt;7편 전체 본문 확장판 초안&lt;/b&gt;입니다.&lt;br /&gt;이번 편은 &lt;b&gt;Parca를 Kubernetes 환경에서 &amp;ldquo;제대로&amp;rdquo; 쓰기 위한 핵심 이론 편&lt;/b&gt;입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;225&quot; data-start=&quot;88&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;119&quot; data-start=&quot;88&quot;&gt;컨테이너 환경에서 왜 profiling이 더 어려운지&lt;/li&gt;
&lt;li data-end=&quot;169&quot; data-start=&quot;120&quot;&gt;PID / Namespace / cgroup 관점에서 Parca가 무엇을 보고 있는지&lt;/li&gt;
&lt;li data-end=&quot;200&quot; data-start=&quot;170&quot;&gt;Flamegraph를 &lt;b&gt;어디까지 믿어도 되는지&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;225&quot; data-start=&quot;201&quot;&gt;실무에서 가장 많이 헷갈리는 포인트 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;230&quot; data-start=&quot;227&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;263&quot; data-start=&quot;232&quot;&gt;컨테이너&amp;middot;Kubernetes 환경에서의 Parca&lt;/h1&gt;
&lt;h2 data-end=&quot;292&quot; data-start=&quot;264&quot; data-ke-size=&quot;size26&quot;&gt;PID, Namespace, cgroup 관점&lt;/h2&gt;
&lt;p data-end=&quot;356&quot; data-start=&quot;294&quot; data-ke-size=&quot;size16&quot;&gt;Parca를 Kubernetes 환경에 배포한 뒤&lt;br /&gt;Flamegraph를 처음 보면 이런 생각이 들 수 있다.&lt;/p&gt;
&lt;blockquote data-end=&quot;429&quot; data-start=&quot;358&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;429&quot; data-start=&quot;360&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이게 어느 컨테이너 거지?&amp;rdquo;&lt;br /&gt;&amp;ldquo;PID가 왜 이렇게 이상하지?&amp;rdquo;&lt;br /&gt;&amp;ldquo;노드 커널 함수가 왜 이렇게 많이 보이지?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;486&quot; data-start=&quot;431&quot; data-ke-size=&quot;size16&quot;&gt;이 혼란은 &lt;b&gt;도구의 문제가 아니라,&lt;br /&gt;컨테이너 실행 모델을 충분히 이해하지 못했기 때문&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;557&quot; data-start=&quot;488&quot; data-ke-size=&quot;size16&quot;&gt;이번 편에서는&lt;br /&gt;Parca를 Kubernetes 환경에서 해석하기 위해&lt;br /&gt;반드시 알아야 할 &lt;b&gt;3가지 축&lt;/b&gt;을 정리한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;603&quot; data-start=&quot;559&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;576&quot; data-start=&quot;559&quot;&gt;PID Namespace&lt;/li&gt;
&lt;li data-end=&quot;594&quot; data-start=&quot;577&quot;&gt;다른 Namespace들&lt;/li&gt;
&lt;li data-end=&quot;603&quot; data-start=&quot;595&quot;&gt;cgroup&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ 컨테이너 환경에서 profiling이 어려운 이유&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0B5N6/dJMcabbHMAi/JRUGIaSP0GsH6oYqKNW8x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0B5N6/dJMcabbHMAi/JRUGIaSP0GsH6oYqKNW8x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0B5N6/dJMcabbHMAi/JRUGIaSP0GsH6oYqKNW8x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0B5N6%2FdJMcabbHMAi%2FJRUGIaSP0GsH6oYqKNW8x1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;630&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iop70/dJMcafypl0H/QYmBwV8mWU9tb96dCOVKc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iop70/dJMcafypl0H/QYmBwV8mWU9tb96dCOVKc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iop70/dJMcafypl0H/QYmBwV8mWU9tb96dCOVKc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIop70%2FdJMcafypl0H%2FQYmBwV8mWU9tb96dCOVKc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;630&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvV1Ml/dJMcaa4VZfd/oe6OZqkkkuASjw1UIgRXl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvV1Ml/dJMcaa4VZfd/oe6OZqkkkuASjw1UIgRXl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvV1Ml/dJMcaa4VZfd/oe6OZqkkkuASjw1UIgRXl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvV1Ml%2FdJMcaa4VZfd%2Foe6OZqkkkuASjw1UIgRXl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1220&quot; height=&quot;720&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;707&quot; data-start=&quot;688&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너는 &amp;ldquo;가상 머신&amp;rdquo;이 아니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;778&quot; data-start=&quot;709&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;726&quot; data-start=&quot;709&quot;&gt;커널은 &lt;b&gt;호스트와 공유&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;752&quot; data-start=&quot;727&quot;&gt;프로세스는 &lt;b&gt;Namespace로 분리&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;778&quot; data-start=&quot;753&quot;&gt;자원 사용량은 &lt;b&gt;cgroup으로 제한&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;782&quot; data-start=&quot;780&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;826&quot; data-start=&quot;784&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;826&quot; data-start=&quot;786&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;하나의 커널 위에&lt;br /&gt;여러 개의 논리적 세계가 겹쳐 있다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;852&quot; data-start=&quot;828&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 &lt;b&gt;이 겹침을 그대로 본다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;857&quot; data-start=&quot;854&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;891&quot; data-start=&quot;859&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ PID Namespace 관점에서의 Parca&lt;/h2&gt;
&lt;h3 data-end=&quot;919&quot; data-start=&quot;893&quot; data-ke-size=&quot;size23&quot;&gt;컨테이너의 PID 1은 진짜 1이 아니다&lt;/h3&gt;
&lt;p data-end=&quot;933&quot; data-start=&quot;921&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너 안에서 보면:&lt;/p&gt;
&lt;pre id=&quot;code_1766194528126&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ps -ef
PID 1  my-app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 노드에서 보면:&lt;/p&gt;
&lt;pre id=&quot;code_1766194555189&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ps -ef | grep my-app
PID 34721 my-app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1089&quot; data-start=&quot;1038&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1065&quot; data-start=&quot;1038&quot;&gt;컨테이너 내부: PID namespace 기준&lt;/li&gt;
&lt;li data-end=&quot;1089&quot; data-start=&quot;1066&quot;&gt;노드/커널: &lt;b&gt;호스트 PID 기준&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1112&quot; data-start=&quot;1091&quot; data-ke-size=&quot;size23&quot;&gt;Parca는 어느 쪽을 보는가?&lt;/h3&gt;
&lt;blockquote data-end=&quot;1150&quot; data-start=&quot;1114&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1150&quot; data-start=&quot;1116&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Parca는 커널이 보는 PID를 기준으로 샘플링한다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1154&quot; data-start=&quot;1152&quot; data-ke-size=&quot;size16&quot;&gt;즉:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1220&quot; data-start=&quot;1156&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1191&quot; data-start=&quot;1156&quot;&gt;Flamegraph에 보이는 PID = &lt;b&gt;호스트 PID&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1220&quot; data-start=&quot;1192&quot;&gt;컨테이너 내부 PID와 일치하지 않는 것이 정상&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1225&quot; data-start=&quot;1222&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1243&quot; data-start=&quot;1227&quot; data-ke-size=&quot;size23&quot;&gt;실무에서의 오해 포인트&lt;/h3&gt;
&lt;p data-end=&quot;1303&quot; data-start=&quot;1245&quot; data-ke-size=&quot;size16&quot;&gt;❌ &amp;ldquo;왜 PID 1이 안 보이지?&amp;rdquo;&lt;br /&gt;⭕ &amp;ldquo;PID 1은 컨테이너 namespace 안의 논리적 번호다&amp;rdquo;&lt;/p&gt;
&lt;p data-end=&quot;1338&quot; data-start=&quot;1305&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 &lt;b&gt;컨테이너 환상을 벗겨낸 상태&lt;/b&gt;를 보여준다.&lt;/p&gt;
&lt;hr data-end=&quot;1343&quot; data-start=&quot;1340&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1379&quot; data-start=&quot;1345&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ Namespace 관점: 격리는 &amp;ldquo;완전하지 않다&amp;rdquo;&lt;/h2&gt;
&lt;p data-end=&quot;1406&quot; data-start=&quot;1381&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너는 여러 namespace로 격리된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1450&quot; data-start=&quot;1408&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1413&quot; data-start=&quot;1408&quot;&gt;PID&lt;/li&gt;
&lt;li data-end=&quot;1421&quot; data-start=&quot;1414&quot;&gt;Mount&lt;/li&gt;
&lt;li data-end=&quot;1431&quot; data-start=&quot;1422&quot;&gt;Network&lt;/li&gt;
&lt;li data-end=&quot;1437&quot; data-start=&quot;1432&quot;&gt;IPC&lt;/li&gt;
&lt;li data-end=&quot;1443&quot; data-start=&quot;1438&quot;&gt;UTS&lt;/li&gt;
&lt;li data-end=&quot;1450&quot; data-start=&quot;1444&quot;&gt;User&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1466&quot; data-start=&quot;1452&quot; data-ke-size=&quot;size16&quot;&gt;하지만 중요한 사실 하나:&lt;/p&gt;
&lt;blockquote data-end=&quot;1502&quot; data-start=&quot;1468&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1502&quot; data-start=&quot;1470&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU 실행은 namespace로 격리되지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1549&quot; data-start=&quot;1504&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1510&quot; data-start=&quot;1504&quot;&gt;스케줄링&lt;/li&gt;
&lt;li data-end=&quot;1520&quot; data-start=&quot;1511&quot;&gt;syscall&lt;/li&gt;
&lt;li data-end=&quot;1532&quot; data-start=&quot;1521&quot;&gt;interrupt&lt;/li&gt;
&lt;li data-end=&quot;1549&quot; data-start=&quot;1533&quot;&gt;context switch&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1575&quot; data-start=&quot;1551&quot; data-ke-size=&quot;size16&quot;&gt;이 모든 것은 &lt;b&gt;호스트 커널 전역&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;1580&quot; data-start=&quot;1577&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1610&quot; data-start=&quot;1582&quot; data-ke-size=&quot;size23&quot;&gt;Flamegraph에 커널 함수가 많은 이유&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.svg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHsvTU/dJMcadN4rQH/GHSKYAOkXIUMEv5LWsZl2k/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHsvTU/dJMcadN4rQH/GHSKYAOkXIUMEv5LWsZl2k/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHsvTU/dJMcadN4rQH/GHSKYAOkXIUMEv5LWsZl2k/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHsvTU%2FdJMcadN4rQH%2FGHSKYAOkXIUMEv5LWsZl2k%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;290&quot; data-filename=&quot;1.svg&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RrnRu/dJMcaiV9OOF/im0eZggKTHklggPBe0AxGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RrnRu/dJMcaiV9OOF/im0eZggKTHklggPBe0AxGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RrnRu/dJMcaiV9OOF/im0eZggKTHklggPBe0AxGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRrnRu%2FdJMcaiV9OOF%2Fim0eZggKTHklggPBe0AxGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;801&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kubernetes 환경에서 Parca Flamegraph를 보면&lt;br /&gt;다음이 자주 보인다.&lt;/p&gt;
&lt;pre id=&quot;code_1766194723489&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;__schedule()
do_syscall_64()
futex_wait()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1772&quot; data-start=&quot;1761&quot; data-ke-size=&quot;size16&quot;&gt;이건 이상이 아니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1809&quot; data-start=&quot;1774&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1785&quot; data-start=&quot;1774&quot;&gt;컨테이너 수 증가&lt;/li&gt;
&lt;li data-end=&quot;1796&quot; data-start=&quot;1786&quot;&gt;스레드 수 증가&lt;/li&gt;
&lt;li data-end=&quot;1809&quot; data-start=&quot;1797&quot;&gt;락 / I/O 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1828&quot; data-start=&quot;1811&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;커널 비중 자연 증가&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;1833&quot; data-start=&quot;1830&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1866&quot; data-start=&quot;1835&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ cgroup: 컨테이너를 구분하는 핵심 단서&lt;/h2&gt;
&lt;p data-end=&quot;1886&quot; data-start=&quot;1868&quot; data-ke-size=&quot;size16&quot;&gt;여기서 Parca가 빛을 발한다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1925&quot; data-start=&quot;1888&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1925&quot; data-start=&quot;1890&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컨테이너 구분의 핵심은 PID가 아니라 cgroup이다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1930&quot; data-start=&quot;1927&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1958&quot; data-start=&quot;1932&quot; data-ke-size=&quot;size23&quot;&gt;Parca는 cgroup 정보를 수집한다&lt;/h3&gt;
&lt;p data-end=&quot;1981&quot; data-start=&quot;1960&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent는 샘플링 시점에:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2027&quot; data-start=&quot;1983&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2003&quot; data-start=&quot;1983&quot;&gt;현재 task의 cgroup 정보&lt;/li&gt;
&lt;li data-end=&quot;2027&quot; data-start=&quot;2004&quot;&gt;container / pod label&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2039&quot; data-start=&quot;2029&quot; data-ke-size=&quot;size16&quot;&gt;을 함께 태깅한다.&lt;/p&gt;
&lt;p data-end=&quot;2063&quot; data-start=&quot;2041&quot; data-ke-size=&quot;size16&quot;&gt;이 덕분에 Parca Server에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2103&quot; data-start=&quot;2065&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2073&quot; data-start=&quot;2065&quot;&gt;pod 단위&lt;/li&gt;
&lt;li data-end=&quot;2088&quot; data-start=&quot;2074&quot;&gt;container 단위&lt;/li&gt;
&lt;li data-end=&quot;2103&quot; data-start=&quot;2089&quot;&gt;namespace 단위&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2133&quot; data-start=&quot;2105&quot; data-ke-size=&quot;size16&quot;&gt;로 Flamegraph를 &lt;b&gt;필터링&lt;/b&gt;할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2138&quot; data-start=&quot;2135&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2163&quot; data-start=&quot;2140&quot; data-ke-size=&quot;size23&quot;&gt;Kubernetes에서의 필터링 예&lt;/h3&gt;
&lt;pre id=&quot;code_1766194760890&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;namespace = &quot;production&quot;
pod       = &quot;api-server-7f9c8d&quot;
container = &quot;app&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2297&quot; data-start=&quot;2253&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이 조건으로 보면&lt;br /&gt;다른 컨테이너의 CPU 경로는 &lt;b&gt;완전히 제거&lt;/b&gt;된다.&lt;/p&gt;
&lt;hr data-end=&quot;2302&quot; data-start=&quot;2299&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2340&quot; data-start=&quot;2304&quot; data-ke-size=&quot;size26&quot;&gt;5️⃣ &amp;ldquo;PID 1&amp;rdquo;이 Flamegraph에 보일 때의 의미&lt;/h2&gt;
&lt;p data-end=&quot;2370&quot; data-start=&quot;2342&quot; data-ke-size=&quot;size16&quot;&gt;Kubernetes 환경에서 흔히 보이는 장면이다.&lt;/p&gt;
&lt;pre id=&quot;code_1766194790232&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;PID 1
 └─ pause&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2412&quot; data-start=&quot;2401&quot; data-ke-size=&quot;size16&quot;&gt;이건 오류가 아니다.&lt;/p&gt;
&lt;hr data-end=&quot;2417&quot; data-start=&quot;2414&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2437&quot; data-start=&quot;2419&quot; data-ke-size=&quot;size23&quot;&gt;pause 컨테이너의 역할&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2506&quot; data-start=&quot;2439&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2463&quot; data-start=&quot;2439&quot;&gt;pod의 네트워크 namespace 유지&lt;/li&gt;
&lt;li data-end=&quot;2480&quot; data-start=&quot;2464&quot;&gt;실제 workload 없음&lt;/li&gt;
&lt;li data-end=&quot;2506&quot; data-start=&quot;2481&quot;&gt;하지만 namespace anchor 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2539&quot; data-start=&quot;2508&quot; data-ke-size=&quot;size16&quot;&gt;Parca Flamegraph에서 pause가 보인다면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2585&quot; data-start=&quot;2541&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2556&quot; data-start=&quot;2541&quot;&gt;CPU를 썼다는 의미 ❌&lt;/li&gt;
&lt;li data-end=&quot;2585&quot; data-start=&quot;2557&quot;&gt;namespace 경로상 등장했다는 의미 ⭕&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2590&quot; data-start=&quot;2587&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2618&quot; data-start=&quot;2592&quot; data-ke-size=&quot;size26&quot;&gt;6️⃣ DaemonSet으로 배포하는 이유&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baSWUS/dJMb99Su6pa/OxbM12tlZzHvrMKS5nEj00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baSWUS/dJMb99Su6pa/OxbM12tlZzHvrMKS5nEj00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baSWUS/dJMb99Su6pa/OxbM12tlZzHvrMKS5nEj00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaSWUS%2FdJMb99Su6pa%2FOxbM12tlZzHvrMKS5nEj00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;628&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmoUFz/dJMcachnz67/ETpBQh4Pagt85q5kpVK7W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmoUFz/dJMcachnz67/ETpBQh4Pagt85q5kpVK7W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmoUFz/dJMcachnz67/ETpBQh4Pagt85q5kpVK7W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmoUFz%2FdJMcachnz67%2FETpBQh4Pagt85q5kpVK7W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1160&quot; height=&quot;680&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;2698&quot; data-start=&quot;2662&quot; data-ke-size=&quot;size16&quot;&gt;Parca Agent는 반드시 &lt;b&gt;노드 단위&lt;/b&gt;로 배포해야 한다.&lt;/p&gt;
&lt;h3 data-end=&quot;2706&quot; data-start=&quot;2700&quot; data-ke-size=&quot;size23&quot;&gt;이유&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2789&quot; data-start=&quot;2708&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2733&quot; data-start=&quot;2708&quot;&gt;eBPF는 &lt;b&gt;노드 커널에 attach&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2789&quot; data-start=&quot;2734&quot;&gt;컨테이너 하나에만 붙이면:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2789&quot; data-start=&quot;2753&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2776&quot; data-start=&quot;2753&quot;&gt;다른 컨테이너의 CPU 실행 경로 누락&lt;/li&gt;
&lt;li data-end=&quot;2789&quot; data-start=&quot;2779&quot;&gt;커널 스택 왜곡&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2807&quot; data-start=&quot;2791&quot; data-ke-size=&quot;size23&quot;&gt;DaemonSet 예시(yaml)&lt;/h3&gt;
&lt;pre id=&quot;code_1766194873519&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: parca-agent
spec:
  template:
    spec:
      hostPID: true
      containers:
      - name: parca-agent
        image: ghcr.io/parca-dev/parca-agent
        securityContext:
          privileged: true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-end=&quot;3107&quot; data-start=&quot;3077&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3107&quot; data-start=&quot;3079&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;hostPID는 선택이 아니라 필수에 가깝다&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;3112&quot; data-start=&quot;3109&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3153&quot; data-start=&quot;3114&quot; data-ke-size=&quot;size26&quot;&gt;7️⃣ Kubernetes 환경에서 Flamegraph 해석 요령&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3296&quot; data-start=&quot;3173&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3370&quot; data-start=&quot;3321&quot;&gt;반드시 지켜야 할 규칙
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3296&quot; data-start=&quot;3173&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3223&quot; data-start=&quot;3173&quot;&gt;&lt;b&gt;필터부터 걸고 본다&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3223&quot; data-start=&quot;3194&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3223&quot; data-start=&quot;3194&quot;&gt;namespace / pod / container&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;3243&quot; data-start=&quot;3224&quot;&gt;PID 번호에 집착하지 않는다&lt;/li&gt;
&lt;li data-end=&quot;3267&quot; data-start=&quot;3244&quot;&gt;커널 함수 비중을 정상으로 받아들인다&lt;/li&gt;
&lt;li data-end=&quot;3296&quot; data-start=&quot;3268&quot;&gt;단일 Flamegraph로 결론 내리지 않는다&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;3301&quot; data-start=&quot;3298&quot; data-ke-style=&quot;style1&quot; /&gt;자주 하는 잘못된 해석❌ &amp;ldquo;PID가 이상하니 Parca가 틀렸다&amp;rdquo;&lt;br /&gt;⭕ &amp;ldquo;PID namespace를 이해해야 한다&amp;rdquo;&lt;hr data-end=&quot;3430&quot; data-start=&quot;3427&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;b&gt;8️⃣ 이 편의 핵심 요약&lt;/b&gt; &lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3564&quot; data-start=&quot;3451&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3480&quot; data-start=&quot;3451&quot;&gt;Parca는 &lt;b&gt;컨테이너가 아니라 커널을 본다&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3511&quot; data-start=&quot;3481&quot;&gt;컨테이너 구분은 PID가 아니라 &lt;b&gt;cgroup&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3564&quot; data-start=&quot;3512&quot;&gt;Kubernetes에서 Parca는:
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3564&quot; data-start=&quot;3537&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3546&quot; data-start=&quot;3537&quot;&gt;더 강력해지고&lt;/li&gt;
&lt;li data-end=&quot;3564&quot; data-start=&quot;3549&quot;&gt;동시에 더 오해받기 쉽다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;컨테이너는 추상화이고,&lt;br /&gt;Parca는 그 추상화를 벗긴다.&lt;/b&gt;&lt;hr data-end=&quot;3612&quot; data-start=&quot;3609&quot; data-ke-style=&quot;style1&quot; /&gt;다음 편 예고
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3722&quot; data-start=&quot;3672&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3693&quot; data-start=&quot;3672&quot;&gt;커널 버전 차이를 어떻게 극복하는가&lt;/li&gt;
&lt;li data-end=&quot;3705&quot; data-start=&quot;3694&quot;&gt;BTF는 무엇인가&lt;/li&gt;
&lt;li data-end=&quot;3722&quot; data-start=&quot;3706&quot;&gt;왜 운영 환경에서 중요한가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3727&quot; data-start=&quot;3724&quot; data-ke-style=&quot;style1&quot; /&gt;다음 편&lt;/li&gt;
&lt;li data-end=&quot;3783&quot; data-start=&quot;3740&quot;&gt;&lt;b&gt;8편. CO-RE와 Parca &amp;ndash; 커널 의존성 문제는 어떻게 해결되는가&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;3670&quot; data-start=&quot;3626&quot;&gt;다음 편에서는&lt;br /&gt;Parca의 또 다른 핵심 기술인 &lt;b&gt;CO-RE&lt;/b&gt;를 다룬다.&lt;/li&gt;
&lt;li data-end=&quot;3370&quot; data-start=&quot;3321&quot;&gt;❌ &amp;ldquo;커널 함수가 많으니 커널 문제다&amp;rdquo;&lt;br /&gt;⭕ &amp;ldquo;컨테이너 수 증가로 커널 경로가 늘었다&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Parca</category>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/9</guid>
      <comments>https://overfrost.tistory.com/9#entry9comment</comments>
      <pubDate>Sat, 20 Dec 2025 10:46:11 +0900</pubDate>
    </item>
    <item>
      <title>Datadog은 push 모델</title>
      <link>https://overfrost.tistory.com/8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;1. Datadog의 기본 수집 방식 (Push)&lt;br&gt;&lt;br&gt;Datadog은 호스트(또는 컨테이너)에 Datadog Agent를 설치하고,&lt;br&gt;이 Agent가 주기적으로 Datadog SaaS 백엔드로 데이터를 전송(push) 합니다.&lt;br&gt;&lt;br&gt;흐름&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;HTML&quot; data-ke-language=&quot;HTML&quot;&gt;&lt;code&gt;[Application / OS / Container]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;↓
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Datadog Agent
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;↓&amp;nbsp;&amp;nbsp;(HTTPS, outbound)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Datadog Backend&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;Agent가 수집하는 것&lt;br&gt;	•	시스템 메트릭 (CPU, Memory, Disk, Network)&lt;br&gt;	•	애플리케이션 메트릭&lt;br&gt;	•	로그 (선택)&lt;br&gt;	•	APM Trace&lt;br&gt;	•	프로파일링 데이터&lt;br&gt;	•	컨테이너 / Kubernetes 메타데이터&lt;br&gt;&lt;br&gt;→ 모두 Agent가 주도적으로 전송합니다.&lt;br&gt;&lt;br&gt;⸻&lt;br&gt;&lt;br&gt;2. Prometheus와의 결정적 차이&lt;br&gt;&lt;br&gt;항목	Datadog	Prometheus&lt;br&gt;수집 주체	Agent	Prometheus Server&lt;br&gt;모델	Push (Agent → Backend)	Pull (Server → Target)&lt;br&gt;네트워크	Outbound 위주	Inbound 필요&lt;br&gt;SaaS 친화성	매우 높음	상대적으로 낮음&lt;br&gt;방화벽 구성	단순	복잡해질 수 있음&lt;br&gt;&lt;br&gt;Datadog이 대규모 SaaS 환경, 기업망, 클라우드에서 많이 쓰이는 이유 중 하나가 Push 기반이라 네트워크 제약이 적기 때문입니다.&lt;br&gt;&lt;br&gt;⸻&lt;br&gt;&lt;br&gt;3. “그런데 Pull처럼 보이는 경우” (예외적 요소)&lt;br&gt;&lt;br&gt;Datadog 내부에는 Pull 성격을 가진 구성 요소도 일부 존재합니다.&lt;br&gt;&lt;br&gt;1) Prometheus Integration&lt;br&gt;	•	Datadog Agent가 Prometheus exporter endpoint를 scrape&lt;br&gt;	•	이 경우:&lt;br&gt;	•	Prometheus Server → Pull ❌&lt;br&gt;	•	Datadog Agent → Pull (scrape) ⭕&lt;br&gt;&lt;br&gt;즉, Datadog 전체 아키텍처는 Push지만,&lt;br&gt;Agent 내부에서 특정 타겟을 Pull하는 구조는 존재합니다.&lt;br&gt;&lt;br&gt;⸻&lt;br&gt;&lt;br&gt;2) OpenMetrics / StatsD&lt;br&gt;	•	애플리케이션 → Agent 로 Push&lt;br&gt;	•	Agent → Datadog Backend 로 Push&lt;br&gt;&lt;br&gt;여전히 전체 흐름은 Push 기반입니다.&lt;br&gt;&lt;br&gt;⸻&lt;br&gt;&lt;br&gt;4. 한 문장 요약&lt;br&gt;&lt;br&gt;Datadog은 전체 시스템 관점에서는 명확한 Push 모델이며,&lt;br&gt;Agent 내부에서만 제한적으로 Pull(scrape)을 사용한다.&lt;br&gt;&lt;br&gt;⸻&lt;br&gt;&lt;br&gt;5. eBPF·Parca·Prometheus를 같이 보는 관점에서&lt;br&gt;&lt;br&gt;지금처럼 eBPF, Parca, Prometheus, Datadog을 함께 비교하는 상황이라면&lt;br&gt;구조를 이렇게 이해하면 정확합니다.&lt;br&gt;	•	Prometheus: Pull-first, TSDB 중심&lt;br&gt;	•	Datadog: Agent-centric Push-first SaaS&lt;br&gt;	•	Parca: Pull + eBPF profiling (Prometheus 생태계 친화)&lt;/p&gt;</description>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/8</guid>
      <comments>https://overfrost.tistory.com/8#entry8comment</comments>
      <pubDate>Fri, 19 Dec 2025 07:02:35 +0900</pubDate>
    </item>
    <item>
      <title>Prometheus는 Pull 모델</title>
      <link>https://overfrost.tistory.com/7</link>
      <description>&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;Prometheus의 기본 수집 방식 (Pull)&lt;br&gt;	•	Prometheus 서버가 주기적으로(Target scrape interval)&lt;br&gt;각 대상(exporter, 애플리케이션)의 HTTP endpoint에 직접 요청합니다.&lt;br&gt;	•	보통 /metrics 엔드포인트를 사용합니다.&lt;br&gt;	•	대상이 제공하는 현재 시점의 메트릭 스냅샷을 가져옵니다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;HTML&quot; data-ke-language=&quot;HTML&quot;&gt;&lt;code&gt;Prometheus Server&amp;nbsp;&amp;nbsp;---&amp;gt;&amp;nbsp;&amp;nbsp;HTTP GET /metrics&amp;nbsp;&amp;nbsp;---&amp;gt;&amp;nbsp;&amp;nbsp;Target (Exporter/App)&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;이 구조가 Prometheus 설계의 중심입니다.&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2280&quot; data-origin-height=&quot;1710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KvHdW/dJMcaaYakkk/bLLcOKcYg2EvUuGTtHc1yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KvHdW/dJMcaaYakkk/bLLcOKcYg2EvUuGTtHc1yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KvHdW/dJMcaaYakkk/bLLcOKcYg2EvUuGTtHc1yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKvHdW%2FdJMcaaYakkk%2FbLLcOKcYg2EvUuGTtHc1yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2280&quot; height=&quot;1710&quot; data-origin-width=&quot;2280&quot; data-origin-height=&quot;1710&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;⸻&lt;br&gt;&lt;br&gt;왜 Pull 모델을 선택했는가&lt;br&gt;&lt;br&gt;Pull 모델은 Prometheus 철학과 잘 맞습니다.&lt;br&gt;	1.	서비스 디스커버리와 궁합이 좋음&lt;br&gt;	•	Kubernetes, Consul, EC2 등에서 대상이 동적으로 변해도&lt;br&gt;	•	Prometheus가 “누구를 수집할지”를 스스로 결정&lt;br&gt;	2.	장애 격리가 쉬움&lt;br&gt;	•	대상이 죽어도 Prometheus는 scrape 실패로 인지&lt;br&gt;	•	대상이 Prometheus 상태를 신경 쓸 필요 없음&lt;br&gt;	3.	재현성과 디버깅&lt;br&gt;	•	브라우저나 curl로 /metrics 직접 확인 가능&lt;br&gt;	•	“이 시점에 무엇이 노출되는가”가 명확&lt;br&gt;&lt;br&gt;⸻&lt;br&gt;&lt;br&gt;예외: Push 방식도 존재함 (Pushgateway)&lt;br&gt;&lt;br&gt;Prometheus 생태계에는 예외적으로 Push 방식이 있습니다.&lt;br&gt;&lt;br&gt;Pushgateway&lt;br&gt;	•	짧게 실행되는 batch job을 위한 보조 컴포넌트&lt;br&gt;	•	job이 직접 Prometheus로 보내는 게 아니라,&lt;br&gt;Pushgateway에 push&lt;br&gt;	•	Prometheus는 Pushgateway를 pull&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;HTML&quot; data-ke-language=&quot;HTML&quot;&gt;&lt;code&gt;Batch Job&amp;nbsp;&amp;nbsp;---&amp;gt;&amp;nbsp;&amp;nbsp;Pushgateway&amp;nbsp;&amp;nbsp;&amp;lt;---&amp;nbsp;&amp;nbsp;Prometheus (pull)&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;중요한 점:&lt;br&gt;	•	Prometheus 자체는 여전히 Pull&lt;br&gt;	•	Pushgateway는 임시 저장소 역할&lt;br&gt;&lt;br&gt;⸻&lt;br&gt;&lt;br&gt;정리&lt;br&gt;	•	Prometheus 본체의 수집 모델은 Pull&lt;br&gt;	•	Push는 예외적 보완 수단&lt;br&gt;	•	설계 철학상 Push 중심 모니터링 시스템과는 명확히 다름&lt;br&gt;&lt;br&gt;한 줄 요약하면:&lt;br&gt;&lt;br&gt;Prometheus는 Pull-first 시스템이며, Push는 특수한 경우에만 사용된다.&lt;/p&gt;</description>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/7</guid>
      <comments>https://overfrost.tistory.com/7#entry7comment</comments>
      <pubDate>Fri, 19 Dec 2025 06:23:45 +0900</pubDate>
    </item>
    <item>
      <title>6편. 실전 사례 ① &amp;ndash; CPU 사용률은 정상인데, 성능은 느린 이유</title>
      <link>https://overfrost.tistory.com/6</link>
      <description>&lt;h1 data-end=&quot;203&quot; data-start=&quot;192&quot;&gt;실전 사례 ①&lt;/h1&gt;
&lt;h2 data-end=&quot;231&quot; data-start=&quot;204&quot; data-ke-size=&quot;size26&quot;&gt;CPU 사용률은 정상인데, 성능은 느린 이유&lt;/h2&gt;
&lt;p data-end=&quot;268&quot; data-start=&quot;233&quot; data-ke-size=&quot;size16&quot;&gt;운영 중인 서버에서 다음과 같은 리포트를 받았다고 가정해 보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;374&quot; data-start=&quot;270&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;270&quot;&gt;CPU 사용률: 평균 40~50%&lt;/li&gt;
&lt;li data-end=&quot;309&quot; data-start=&quot;291&quot;&gt;Load Average: 정상&lt;/li&gt;
&lt;li data-end=&quot;321&quot; data-start=&quot;310&quot;&gt;메모리 여유 충분&lt;/li&gt;
&lt;li data-end=&quot;349&quot; data-start=&quot;322&quot;&gt;APM: 주요 API 응답 시간 &amp;ldquo;정상 범위&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;374&quot; data-start=&quot;350&quot;&gt;사용자 체감: &lt;b&gt;&amp;ldquo;전체적으로 느림&amp;rdquo;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;418&quot; data-start=&quot;376&quot; data-ke-size=&quot;size16&quot;&gt;이 상황은 의외로 매우 흔하다.&lt;br /&gt;그리고 가장 골치 아픈 유형이기도 하다.&lt;/p&gt;
&lt;hr data-end=&quot;423&quot; data-start=&quot;420&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;450&quot; data-start=&quot;425&quot; data-ke-size=&quot;size26&quot;&gt;1. 문제의 핵심: &amp;ldquo;정상 지표&amp;rdquo;의 함정&lt;/h2&gt;
&lt;h3 data-end=&quot;467&quot; data-start=&quot;452&quot; data-ke-size=&quot;size23&quot;&gt;전통적 모니터링 지표&lt;/h3&gt;
&lt;pre id=&quot;code_1766056690205&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CPU: 45%
Memory: 62%
Disk IO: 낮음
Network: 정상&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;539&quot; data-start=&quot;527&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 문제 없어 보인다.&lt;/p&gt;
&lt;hr data-end=&quot;544&quot; data-start=&quot;541&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;556&quot; data-start=&quot;546&quot; data-ke-size=&quot;size23&quot;&gt;APM 지표&lt;/h3&gt;
&lt;pre id=&quot;code_1766056732148&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/api/search 평균 110ms
/api/order 평균 180ms
에러율 0%&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;634&quot; data-start=&quot;619&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 역시 문제 없어 보인다.&lt;/p&gt;
&lt;p data-end=&quot;659&quot; data-start=&quot;636&quot; data-ke-size=&quot;size16&quot;&gt;이 단계에서 흔히 나오는 결론은 이것이다.&lt;/p&gt;
&lt;blockquote data-end=&quot;684&quot; data-start=&quot;661&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;684&quot; data-start=&quot;663&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;일시적인 네트워크 문제였나 봅니다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;708&quot; data-start=&quot;686&quot; data-ke-size=&quot;size16&quot;&gt;하지만 사용자는 여전히 느리다고 말한다.&lt;/p&gt;
&lt;hr data-end=&quot;713&quot; data-start=&quot;710&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;732&quot; data-start=&quot;715&quot; data-ke-size=&quot;size26&quot;&gt;2. 문제를 다시 정의하기&lt;/h2&gt;
&lt;p data-end=&quot;749&quot; data-start=&quot;734&quot; data-ke-size=&quot;size16&quot;&gt;여기서 질문을 바꿔야 한다.&lt;/p&gt;
&lt;p data-end=&quot;803&quot; data-start=&quot;751&quot; data-ke-size=&quot;size16&quot;&gt;❌ &amp;ldquo;CPU가 얼마나 쓰이고 있는가?&amp;rdquo;&lt;br /&gt;⭕ &lt;b&gt;&amp;ldquo;CPU가 실제로 무엇을 하고 있는가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;837&quot; data-start=&quot;805&quot; data-ke-size=&quot;size16&quot;&gt;이 질문은&lt;br /&gt;기존 메트릭이나 APM으로는 답할 수 없다.&lt;/p&gt;
&lt;p data-end=&quot;862&quot; data-start=&quot;839&quot; data-ke-size=&quot;size16&quot;&gt;이 지점에서 &lt;b&gt;Parca&lt;/b&gt;를 투입한다.&lt;/p&gt;
&lt;hr data-end=&quot;867&quot; data-start=&quot;864&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;899&quot; data-start=&quot;869&quot; data-ke-size=&quot;size26&quot;&gt;3. Parca로 본 Flamegraph 첫 화면&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1791&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LFmYx/dJMcadAw1A1/mL20kEPglETU3qlvmfU0W1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LFmYx/dJMcadAw1A1/mL20kEPglETU3qlvmfU0W1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LFmYx/dJMcadAw1A1/mL20kEPglETU3qlvmfU0W1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLFmYx%2FdJMcadAw1A1%2FmL20kEPglETU3qlvmfU0W1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1791&quot; height=&quot;599&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1791&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LQuYN/dJMcacPcYF1/jJKYQebs2YYkCz0mTeWbZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LQuYN/dJMcacPcYF1/jJKYQebs2YYkCz0mTeWbZk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LQuYN/dJMcacPcYF1/jJKYQebs2YYkCz0mTeWbZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLQuYN%2FdJMcacPcYF1%2FjJKYQebs2YYkCz0mTeWbZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;290&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgB7Tf/dJMcadN3SGR/NYz0FTje4qrkjFHJLSNgX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgB7Tf/dJMcadN3SGR/NYz0FTje4qrkjFHJLSNgX1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgB7Tf/dJMcadN3SGR/NYz0FTje4qrkjFHJLSNgX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgB7Tf%2FdJMcadN3SGR%2FNYz0FTje4qrkjFHJLSNgX1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1200&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;972&quot; data-start=&quot;943&quot; data-ke-size=&quot;size16&quot;&gt;Flamegraph를 처음 보면 이런 특징이 보인다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1071&quot; data-start=&quot;974&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1002&quot; data-start=&quot;974&quot;&gt;전체 폭은 넓지 않다 (CPU 사용률이 낮으니)&lt;/li&gt;
&lt;li data-end=&quot;1029&quot; data-start=&quot;1003&quot;&gt;그런데 &lt;b&gt;커널 함수 비중이 유난히 크다&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1071&quot; data-start=&quot;1030&quot;&gt;__schedule() / futex_wait() 가 반복 등장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1094&quot; data-start=&quot;1073&quot; data-ke-size=&quot;size16&quot;&gt;이 화면이 말해주는 메시지는 명확하다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1138&quot; data-start=&quot;1096&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1138&quot; data-start=&quot;1098&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU는 계산을 안 하고,&lt;br /&gt;기다리는 데 시간을 쓰고 있다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1143&quot; data-start=&quot;1140&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1174&quot; data-start=&quot;1145&quot; data-ke-size=&quot;size26&quot;&gt;4. Flamegraph 해석 단계별 사고 과정&lt;/h2&gt;
&lt;h3 data-end=&quot;1192&quot; data-start=&quot;1176&quot; data-ke-size=&quot;size23&quot;&gt;1단계: 바닥부터 보기&lt;/h3&gt;
&lt;p data-end=&quot;1221&quot; data-start=&quot;1194&quot; data-ke-size=&quot;size16&quot;&gt;바닥(entry)에 다음과 같은 경로가 반복된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1766056878403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sys_futex
 └─ futex_wait
     └─ __schedule&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1303&quot; data-start=&quot;1280&quot; data-ke-size=&quot;size16&quot;&gt;이 패턴은 거의 공식처럼 해석할 수 있다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1331&quot; data-start=&quot;1305&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1331&quot; data-start=&quot;1307&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;스레드가 락을 기다리며 잠들었다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1336&quot; data-start=&quot;1333&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1361&quot; data-start=&quot;1338&quot; data-ke-size=&quot;size23&quot;&gt;2단계: 유저 코드와의 연결점 찾기&lt;/h3&gt;
&lt;p data-end=&quot;1402&quot; data-start=&quot;1363&quot; data-ke-size=&quot;size16&quot;&gt;커널 스택 위쪽을 따라 올라가면&lt;br /&gt;유저 공간 함수가 보이기 시작한다.&lt;/p&gt;
&lt;pre id=&quot;code_1766056922054&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pthread_mutex_lock
 └─ cache_update()
     └─ handle_request()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1492&quot; data-start=&quot;1480&quot; data-ke-size=&quot;size16&quot;&gt;이제 그림이 그려진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1571&quot; data-start=&quot;1494&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1503&quot; data-start=&quot;1494&quot;&gt;요청 처리 중&lt;/li&gt;
&lt;li data-end=&quot;1526&quot; data-start=&quot;1504&quot;&gt;특정 cache_update 로직에서&lt;/li&gt;
&lt;li data-end=&quot;1545&quot; data-start=&quot;1527&quot;&gt;mutex lock 대기 발생&lt;/li&gt;
&lt;li data-end=&quot;1571&quot; data-start=&quot;1546&quot;&gt;스레드가 잠들며 context switch&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1576&quot; data-start=&quot;1573&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1600&quot; data-start=&quot;1578&quot; data-ke-size=&quot;size26&quot;&gt;5. 왜 CPU 사용률은 낮았는가?&lt;/h2&gt;
&lt;p data-end=&quot;1613&quot; data-start=&quot;1602&quot; data-ke-size=&quot;size16&quot;&gt;이 질문이 핵심이다.&lt;/p&gt;
&lt;p data-end=&quot;1631&quot; data-start=&quot;1615&quot; data-ke-size=&quot;size16&quot;&gt;CPU 사용률이 낮다는 것은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1673&quot; data-start=&quot;1633&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1647&quot; data-start=&quot;1633&quot;&gt;CPU가 놀고 있다 ❌&lt;/li&gt;
&lt;li data-end=&quot;1673&quot; data-start=&quot;1648&quot;&gt;&lt;b&gt;실행할 준비가 된 스레드가 없다 ⭕&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1708&quot; data-start=&quot;1675&quot; data-ke-size=&quot;size16&quot;&gt;락 대기로 스레드들이 잠들어 있으면&lt;br /&gt;CPU는 놀게 된다.&lt;/p&gt;
&lt;p data-end=&quot;1712&quot; data-start=&quot;1710&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;1750&quot; data-start=&quot;1714&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1750&quot; data-start=&quot;1716&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU 사용률은 낮지만&lt;br /&gt;시스템은 느릴 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1755&quot; data-start=&quot;1752&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1781&quot; data-start=&quot;1757&quot; data-ke-size=&quot;size26&quot;&gt;6. APM으로는 왜 보이지 않았을까?&lt;/h2&gt;
&lt;p data-end=&quot;1799&quot; data-start=&quot;1783&quot; data-ke-size=&quot;size16&quot;&gt;APM의 관점은 &amp;ldquo;요청&amp;rdquo;이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1834&quot; data-start=&quot;1801&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1808&quot; data-start=&quot;1801&quot;&gt;요청 시작&lt;/li&gt;
&lt;li data-end=&quot;1816&quot; data-start=&quot;1809&quot;&gt;DB 쿼리&lt;/li&gt;
&lt;li data-end=&quot;1826&quot; data-start=&quot;1817&quot;&gt;비즈니스 로직&lt;/li&gt;
&lt;li data-end=&quot;1834&quot; data-start=&quot;1827&quot;&gt;응답 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1853&quot; data-start=&quot;1836&quot; data-ke-size=&quot;size16&quot;&gt;락 대기는 보통 이렇게 보인다.&lt;/p&gt;
&lt;pre id=&quot;code_1766056956704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Business logic: 180ms&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1903&quot; data-start=&quot;1890&quot; data-ke-size=&quot;size16&quot;&gt;APM은 말하지 않는다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1947&quot; data-start=&quot;1905&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1916&quot; data-start=&quot;1905&quot;&gt;그 180ms 중&lt;/li&gt;
&lt;li data-end=&quot;1931&quot; data-start=&quot;1917&quot;&gt;몇 ms가 락 대기인지&lt;/li&gt;
&lt;li data-end=&quot;1947&quot; data-start=&quot;1932&quot;&gt;몇 ms가 실제 계산인지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1966&quot; data-start=&quot;1949&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 이 공백을 메운다.&lt;/p&gt;
&lt;hr data-end=&quot;1971&quot; data-start=&quot;1968&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1993&quot; data-start=&quot;1973&quot; data-ke-size=&quot;size26&quot;&gt;7. 코드 레벨에서의 문제 예시&lt;/h2&gt;
&lt;p data-end=&quot;2023&quot; data-start=&quot;1995&quot; data-ke-size=&quot;size16&quot;&gt;문제의 원인이 된 코드를 단순화하면 다음과 같았다.&lt;/p&gt;
&lt;pre id=&quot;code_1766056983988&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pthread_mutex_lock(&amp;amp;cache_lock);

/* cache 갱신 */
update_global_cache(req);

pthread_mutex_unlock(&amp;amp;cache_lock);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2156&quot; data-start=&quot;2146&quot; data-ke-size=&quot;size16&quot;&gt;문제는 이 코드가:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2207&quot; data-start=&quot;2158&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2170&quot; data-start=&quot;2158&quot;&gt;모든 요청 경로에서&lt;/li&gt;
&lt;li data-end=&quot;2185&quot; data-start=&quot;2171&quot;&gt;동일한 전역 락을 사용&lt;/li&gt;
&lt;li data-end=&quot;2207&quot; data-start=&quot;2186&quot;&gt;cache update 빈도가 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2215&quot; data-start=&quot;2209&quot; data-ke-size=&quot;size16&quot;&gt;결과적으로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2259&quot; data-start=&quot;2217&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2226&quot; data-start=&quot;2217&quot;&gt;요청 수 증가&lt;/li&gt;
&lt;li data-end=&quot;2236&quot; data-start=&quot;2227&quot;&gt;락 경합 증가&lt;/li&gt;
&lt;li data-end=&quot;2248&quot; data-start=&quot;2237&quot;&gt;스레드 대기 증가&lt;/li&gt;
&lt;li data-end=&quot;2259&quot; data-start=&quot;2249&quot;&gt;체감 성능 저하&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2264&quot; data-start=&quot;2261&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2285&quot; data-start=&quot;2266&quot; data-ke-size=&quot;size26&quot;&gt;8. Parca가 아니었다면?&lt;/h2&gt;
&lt;p data-end=&quot;2307&quot; data-start=&quot;2287&quot; data-ke-size=&quot;size16&quot;&gt;이 문제를 Parca 없이 찾으려면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2362&quot; data-start=&quot;2309&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2321&quot; data-start=&quot;2309&quot;&gt;perf 수동 실행&lt;/li&gt;
&lt;li data-end=&quot;2335&quot; data-start=&quot;2322&quot;&gt;문제 시점 재현 시도&lt;/li&gt;
&lt;li data-end=&quot;2351&quot; data-start=&quot;2336&quot;&gt;운 좋게 같은 상황 발생&lt;/li&gt;
&lt;li data-end=&quot;2362&quot; data-start=&quot;2352&quot;&gt;커널 스택 해석&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2385&quot; data-start=&quot;2364&quot; data-ke-size=&quot;size16&quot;&gt;운영 환경에서는 거의 불가능에 가깝다.&lt;/p&gt;
&lt;p data-end=&quot;2425&quot; data-start=&quot;2387&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 이미 &lt;b&gt;문제 시점의 흔적&lt;/b&gt;을&lt;br /&gt;저장해 두고 있었다.&lt;/p&gt;
&lt;hr data-end=&quot;2430&quot; data-start=&quot;2427&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2458&quot; data-start=&quot;2432&quot; data-ke-size=&quot;size26&quot;&gt;9. 개선 후 Diff Flamegraph&lt;/h2&gt;
&lt;p data-end=&quot;2469&quot; data-start=&quot;2460&quot; data-ke-size=&quot;size16&quot;&gt;개선은 단순했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2522&quot; data-start=&quot;2471&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2484&quot; data-start=&quot;2471&quot;&gt;전역 mutex 제거&lt;/li&gt;
&lt;li data-end=&quot;2503&quot; data-start=&quot;2485&quot;&gt;shard 기반 lock 분리&lt;/li&gt;
&lt;li data-end=&quot;2522&quot; data-start=&quot;2504&quot;&gt;cache update 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;143&quot; data-start=&quot;115&quot; data-ke-size=&quot;size26&quot;&gt;배포 전/후 Diff Flamegraph 비교&lt;/h2&gt;
&lt;p data-end=&quot;227&quot; data-start=&quot;145&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Parca의 Diff Flamegraph&lt;/b&gt;는&lt;br /&gt;두 시점(또는 두 배포 버전)의 CPU 실행 경로 변화를 &lt;b&gt;색상으로 직관적으로&lt;/b&gt; 보여준다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;305&quot; data-start=&quot;229&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;256&quot; data-start=&quot;229&quot;&gt;&lt;b&gt;빨간색&lt;/b&gt;: CPU 사용이 증가한 경로&lt;/li&gt;
&lt;li data-end=&quot;284&quot; data-start=&quot;257&quot;&gt;&lt;b&gt;파란색&lt;/b&gt;: CPU 사용이 감소한 경로&lt;/li&gt;
&lt;li data-end=&quot;305&quot; data-start=&quot;285&quot;&gt;&lt;b&gt;회색/중립&lt;/b&gt;: 큰 변화 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yVwAA/dJMcab3PVqc/rKYZMSvfFqQbWEKEGLoDl1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yVwAA/dJMcab3PVqc/rKYZMSvfFqQbWEKEGLoDl1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yVwAA/dJMcab3PVqc/rKYZMSvfFqQbWEKEGLoDl1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyVwAA%2FdJMcab3PVqc%2FrKYZMSvfFqQbWEKEGLoDl1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;224&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mV2He/dJMcahCYuGM/zy7NljfB6m2Yfg6CONXcb0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mV2He/dJMcahCYuGM/zy7NljfB6m2Yfg6CONXcb0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mV2He/dJMcahCYuGM/zy7NljfB6m2Yfg6CONXcb0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmV2He%2FdJMcahCYuGM%2Fzy7NljfB6m2Yfg6CONXcb0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;370&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;953&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhygUY/dJMcafFaLmc/VHDLGPHIKNn2kP8pKH6hP1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhygUY/dJMcafFaLmc/VHDLGPHIKNn2kP8pKH6hP1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhygUY/dJMcafFaLmc/VHDLGPHIKNn2kP8pKH6hP1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhygUY%2FdJMcafFaLmc%2FVHDLGPHIKNn2kP8pKH6hP1%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1844&quot; height=&quot;953&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;953&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;371&quot; data-start=&quot;354&quot; data-ke-size=&quot;size23&quot;&gt;배포 전 (Before)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;431&quot; data-start=&quot;373&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;389&quot; data-start=&quot;373&quot;&gt;__schedule()&lt;/li&gt;
&lt;li data-end=&quot;406&quot; data-start=&quot;390&quot;&gt;futex_wait()&lt;/li&gt;
&lt;li data-end=&quot;431&quot; data-start=&quot;407&quot;&gt;pthread_mutex_lock()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;493&quot; data-start=&quot;433&quot; data-ke-size=&quot;size16&quot;&gt;경로가 &lt;b&gt;넓고 반복적으로 등장&lt;/b&gt;&lt;br /&gt;&amp;rarr; 스레드가 자주 잠들고 깨어남&lt;br /&gt;&amp;rarr; 락 경합 + 스케줄링 오버헤드&lt;/p&gt;
&lt;hr data-end=&quot;498&quot; data-start=&quot;495&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;516&quot; data-start=&quot;500&quot; data-ke-size=&quot;size23&quot;&gt;배포 후 (After)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;596&quot; data-start=&quot;518&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;543&quot; data-start=&quot;518&quot;&gt;커널 스케줄링 경로 &lt;b&gt;파란색으로 감소&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;570&quot; data-start=&quot;544&quot;&gt;유저 함수 실행 경로 &lt;b&gt;상대적으로 증가&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;596&quot; data-start=&quot;571&quot;&gt;Flamegraph의 &amp;ldquo;톱니형 분기&amp;rdquo; 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;610&quot; data-start=&quot;598&quot; data-ke-size=&quot;size16&quot;&gt;이는 다음을 의미한다.&lt;/p&gt;
&lt;blockquote data-end=&quot;658&quot; data-start=&quot;612&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;658&quot; data-start=&quot;614&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU가 기다리는 시간은 줄고,&lt;br /&gt;실제 일을 하는 시간은 늘어났다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;663&quot; data-start=&quot;660&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;689&quot; data-start=&quot;665&quot; data-ke-size=&quot;size23&quot;&gt;이 Diff 화면이 주는 결정적 가치&lt;/h3&gt;
&lt;p data-end=&quot;735&quot; data-start=&quot;691&quot; data-ke-size=&quot;size16&quot;&gt;이 한 장의 Diff Flamegraph만으로도 다음을 동시에 설명할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;802&quot; data-start=&quot;737&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;754&quot; data-start=&quot;737&quot;&gt;왜 체감 성능이 개선되었는지&lt;/li&gt;
&lt;li data-end=&quot;779&quot; data-start=&quot;755&quot;&gt;왜 CPU 사용률이 크게 변하지 않았는지&lt;/li&gt;
&lt;li data-end=&quot;802&quot; data-start=&quot;780&quot;&gt;왜 APM 지표는 큰 변화가 없었는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;806&quot; data-start=&quot;804&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;blockquote data-end=&quot;855&quot; data-start=&quot;808&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;855&quot; data-start=&quot;810&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;성능 개선이 실제로 CPU 실행 경로를 바꿨다&amp;rdquo;&lt;/b&gt;&lt;br /&gt;는 증거가 된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-end=&quot;2742&quot; data-start=&quot;2724&quot; data-ke-size=&quot;size26&quot;&gt;10. 이 사례가 주는 교훈&lt;/h2&gt;
&lt;p data-end=&quot;2759&quot; data-start=&quot;2744&quot; data-ke-size=&quot;size16&quot;&gt;이 사례의 핵심은 이것이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2823&quot; data-start=&quot;2761&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2781&quot; data-start=&quot;2761&quot;&gt;CPU 사용률은 &lt;b&gt;결과&lt;/b&gt;일 뿐&lt;/li&gt;
&lt;li data-end=&quot;2801&quot; data-start=&quot;2782&quot;&gt;원인은 &lt;b&gt;실행 경로&lt;/b&gt;에 있다&lt;/li&gt;
&lt;li data-end=&quot;2823&quot; data-start=&quot;2802&quot;&gt;APM과 메트릭은 충분조건이 아니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2844&quot; data-start=&quot;2825&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 다음 질문에 답해준다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2873&quot; data-start=&quot;2846&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2873&quot; data-start=&quot;2848&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;CPU 시간이 &lt;b&gt;왜&lt;/b&gt; 그렇게 쓰였는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2878&quot; data-start=&quot;2875&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2902&quot; data-start=&quot;2880&quot; data-ke-size=&quot;size26&quot;&gt;체크리스트: 비슷한 증상을 만났다면&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2981&quot; data-start=&quot;2904&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2923&quot; data-start=&quot;2904&quot;&gt;CPU 사용률은 정상인데 느리다&lt;/li&gt;
&lt;li data-end=&quot;2943&quot; data-start=&quot;2924&quot;&gt;APM은 정상인데 체감이 나쁘다&lt;/li&gt;
&lt;li data-end=&quot;2962&quot; data-start=&quot;2944&quot;&gt;요청 수가 늘수록 더 느려진다&lt;/li&gt;
&lt;li data-end=&quot;2981&quot; data-start=&quot;2963&quot;&gt;컨텍스트 스위치가 많아 보인다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3008&quot; data-start=&quot;2983&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;Parca로 커널 스택부터 확인하라&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3013&quot; data-start=&quot;3010&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3025&quot; data-start=&quot;3015&quot; data-ke-size=&quot;size26&quot;&gt;이 편의 결론&lt;/h2&gt;
&lt;blockquote data-end=&quot;3070&quot; data-start=&quot;3027&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3070&quot; data-start=&quot;3029&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;느리다&amp;rdquo;는 말은 감정이지만,&lt;br /&gt;Flamegraph는 증거다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3125&quot; data-start=&quot;3072&quot; data-ke-size=&quot;size16&quot;&gt;Parca는&lt;br /&gt;설명하기 어려운 성능 문제를&lt;br /&gt;&lt;b&gt;말로 설명 가능하게 만들어 주는 도구&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-end=&quot;3130&quot; data-start=&quot;3127&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3142&quot; data-start=&quot;3132&quot; data-ke-size=&quot;size26&quot;&gt;다음 편 예고&lt;/h2&gt;
&lt;p data-end=&quot;3171&quot; data-start=&quot;3144&quot; data-ke-size=&quot;size16&quot;&gt;다음 편에서는&lt;br /&gt;이번보다 한 단계 더 들어가서,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3222&quot; data-start=&quot;3173&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3182&quot; data-start=&quot;3173&quot;&gt;컨테이너 환경&lt;/li&gt;
&lt;li data-end=&quot;3195&quot; data-start=&quot;3183&quot;&gt;Kubernetes&lt;/li&gt;
&lt;li data-end=&quot;3222&quot; data-start=&quot;3196&quot;&gt;PID / namespace / cgroup&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3252&quot; data-start=&quot;3224&quot; data-ke-size=&quot;size16&quot;&gt;에서 Parca를 어떻게 해석해야 하는지를 다룬다.&lt;/p&gt;
&lt;hr data-end=&quot;3257&quot; data-start=&quot;3254&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3269&quot; data-start=&quot;3259&quot; data-ke-size=&quot;size23&quot;&gt;다음 편&lt;/h3&gt;
&lt;p data-end=&quot;3333&quot; data-start=&quot;3270&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7편. 컨테이너&amp;middot;Kubernetes 환경에서의 Parca &amp;ndash; PID, Namespace, cgroup 관점&lt;/b&gt;&lt;/p&gt;</description>
      <category>Parca</category>
      <category>BPF</category>
      <category>ebpf</category>
      <category>observability</category>
      <category>parca</category>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/6</guid>
      <comments>https://overfrost.tistory.com/6#entry6comment</comments>
      <pubDate>Thu, 18 Dec 2025 20:27:08 +0900</pubDate>
    </item>
    <item>
      <title>5편. Flamegraph 제대로 읽기&amp;ndash; Parca UI 해석 가이드</title>
      <link>https://overfrost.tistory.com/5</link>
      <description>&lt;h1 data-end=&quot;248&quot; data-start=&quot;227&quot;&gt;Flamegraph 제대로 읽기&lt;/h1&gt;
&lt;h2 data-end=&quot;267&quot; data-start=&quot;249&quot; data-ke-size=&quot;size26&quot;&gt;Parca UI 해석 가이드&lt;/h2&gt;
&lt;p data-end=&quot;299&quot; data-start=&quot;269&quot; data-ke-size=&quot;size16&quot;&gt;Parca를 처음 실행하면 대부분 이런 반응을 보인다.&lt;/p&gt;
&lt;blockquote data-end=&quot;335&quot; data-start=&quot;301&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;335&quot; data-start=&quot;303&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그래프는 나오는데&amp;hellip;&lt;br /&gt;이걸 어떻게 해석해야 하지?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;389&quot; data-start=&quot;337&quot; data-ke-size=&quot;size16&quot;&gt;Flamegraph는 &lt;b&gt;직관적인 듯 보이지만&lt;/b&gt;,&lt;br /&gt;실제로는 매우 쉽게 오해되는 시각화다.&lt;/p&gt;
&lt;p data-end=&quot;407&quot; data-start=&quot;391&quot; data-ke-size=&quot;size16&quot;&gt;이번 편의 목표는 단 하나다.&lt;/p&gt;
&lt;blockquote data-end=&quot;461&quot; data-start=&quot;409&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;461&quot; data-start=&quot;411&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Flamegraph를 &amp;lsquo;그림&amp;rsquo;이 아니라&lt;br /&gt;&amp;lsquo;성능 설명 도구&amp;rsquo;로 읽게 만드는 것&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;466&quot; data-start=&quot;463&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;502&quot; data-start=&quot;468&quot; data-ke-size=&quot;size26&quot;&gt;Flamegraph는 무엇을 보여주는가 (한 문장 정의)&lt;/h2&gt;
&lt;blockquote data-end=&quot;569&quot; data-start=&quot;504&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;569&quot; data-start=&quot;506&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Flamegraph는&lt;br /&gt;CPU 시간이 어떤 함수 호출 경로에서&lt;br /&gt;얼마나 사용되었는지를 보여준다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;588&quot; data-start=&quot;571&quot; data-ke-size=&quot;size16&quot;&gt;여기서 핵심 단어는 세 가지다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;630&quot; data-start=&quot;590&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;598&quot; data-start=&quot;590&quot;&gt;CPU 시간&lt;/li&gt;
&lt;li data-end=&quot;622&quot; data-start=&quot;599&quot;&gt;함수 호출 경로 (call stack)&lt;/li&gt;
&lt;li data-end=&quot;630&quot; data-start=&quot;623&quot;&gt;누적 분포&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;2198&quot; data-origin-height=&quot;1376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vcPQ0/dJMcafrDh9m/l5Au2sD0ab72pFx28Mn0p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vcPQ0/dJMcafrDh9m/l5Au2sD0ab72pFx28Mn0p1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vcPQ0/dJMcafrDh9m/l5Au2sD0ab72pFx28Mn0p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvcPQ0%2FdJMcafrDh9m%2Fl5Au2sD0ab72pFx28Mn0p1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2198&quot; height=&quot;1376&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;2198&quot; data-origin-height=&quot;1376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1958&quot; data-origin-height=&quot;1204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beilUa/dJMcagxiOfb/NEaF9uZjRK9KKZGfYc4kc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beilUa/dJMcagxiOfb/NEaF9uZjRK9KKZGfYc4kc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beilUa/dJMcagxiOfb/NEaF9uZjRK9KKZGfYc4kc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeilUa%2FdJMcagxiOfb%2FNEaF9uZjRK9KKZGfYc4kc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1958&quot; height=&quot;1204&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1958&quot; data-origin-height=&quot;1204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.svg&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NkHwI/dJMcafSHMmA/Pf3h5mhq28jcH7re8JMwl1/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NkHwI/dJMcafSHMmA/Pf3h5mhq28jcH7re8JMwl1/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NkHwI/dJMcafSHMmA/Pf3h5mhq28jcH7re8JMwl1/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNkHwI%2FdJMcafSHMmA%2FPf3h5mhq28jcH7re8JMwl1%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;418&quot; data-filename=&quot;3.svg&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;747&quot; data-start=&quot;706&quot; data-ke-size=&quot;size16&quot;&gt;Parca UI에서 보는 Flamegraph는 다음과 같은 규칙을 가진다.&lt;/p&gt;
&lt;h3 data-end=&quot;769&quot; data-start=&quot;749&quot; data-ke-size=&quot;size23&quot;&gt;X축: 시간 비율 (가로 폭)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;842&quot; data-start=&quot;771&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;807&quot; data-start=&quot;771&quot;&gt;가로 폭이 넓을수록&lt;br /&gt;&amp;rarr; &lt;b&gt;CPU 시간을 많이 사용&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;826&quot; data-start=&quot;808&quot;&gt;좌우 위치 자체에는 의미 없음&lt;/li&gt;
&lt;li data-end=&quot;842&quot; data-start=&quot;827&quot;&gt;&lt;b&gt;폭만 의미가 있다&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;862&quot; data-start=&quot;844&quot; data-ke-size=&quot;size23&quot;&gt;Y축: 호출 깊이 (세로)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;939&quot; data-start=&quot;864&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;892&quot; data-start=&quot;864&quot;&gt;아래 &amp;rarr; 위로 갈수록&lt;br /&gt;&amp;rarr; 더 깊은 함수 호출&lt;/li&gt;
&lt;li data-end=&quot;912&quot; data-start=&quot;893&quot;&gt;맨 아래는 진입점 (entry)&lt;/li&gt;
&lt;li data-end=&quot;939&quot; data-start=&quot;913&quot;&gt;맨 위는 실제 실행 지점 (hot code)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;944&quot; data-start=&quot;941&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;961&quot; data-start=&quot;946&quot; data-ke-size=&quot;size26&quot;&gt;가장 흔한 오해 ①&lt;/h2&gt;
&lt;h3 data-end=&quot;983&quot; data-start=&quot;962&quot; data-ke-size=&quot;size23&quot;&gt;&amp;ldquo;위에 있는 함수가 범인이다?&amp;rdquo;&lt;/h3&gt;
&lt;p data-end=&quot;991&quot; data-start=&quot;985&quot; data-ke-size=&quot;size16&quot;&gt;❌ 틀렸다.&lt;/p&gt;
&lt;p data-end=&quot;1032&quot; data-start=&quot;993&quot; data-ke-size=&quot;size16&quot;&gt;Flamegraph에서 &lt;b&gt;위에 있다는 사실 자체는 중요하지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1041&quot; data-start=&quot;1034&quot; data-ke-size=&quot;size16&quot;&gt;중요한 것은:&lt;/p&gt;
&lt;blockquote data-end=&quot;1068&quot; data-start=&quot;1043&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1068&quot; data-start=&quot;1045&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;얼마나 넓은 경로의 &amp;lsquo;끝&amp;rsquo;에 있는가&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1073&quot; data-start=&quot;1070&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1087&quot; data-start=&quot;1075&quot; data-ke-size=&quot;size23&quot;&gt;잘못된 해석 예&lt;/h3&gt;
&lt;pre id=&quot;code_1766056293867&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;맨 위에 custom_hash_lookup() 이 있음
&amp;rarr; 이 함수가 문제다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1156&quot; data-start=&quot;1145&quot; data-ke-size=&quot;size16&quot;&gt;이 해석은 위험하다.&lt;/p&gt;
&lt;p data-end=&quot;1171&quot; data-start=&quot;1158&quot; data-ke-size=&quot;size16&quot;&gt;올바른 질문은 이것이다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1235&quot; data-start=&quot;1173&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1235&quot; data-start=&quot;1175&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;custom_hash_lookup() 이&lt;br /&gt;전체 CPU 시간 중 &lt;b&gt;몇 %의 경로에 포함되는가?&lt;/b&gt;&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1240&quot; data-start=&quot;1237&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1277&quot; data-start=&quot;1242&quot; data-ke-size=&quot;size26&quot;&gt;Inclusive Cost vs Exclusive Cost&lt;/h2&gt;
&lt;p data-end=&quot;1304&quot; data-start=&quot;1279&quot; data-ke-size=&quot;size16&quot;&gt;Flamegraph를 이해하는 핵심 개념이다.&lt;/p&gt;
&lt;h3 data-end=&quot;1332&quot; data-start=&quot;1306&quot; data-ke-size=&quot;size23&quot;&gt;Inclusive Cost (포함 비용)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1393&quot; data-start=&quot;1334&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1370&quot; data-start=&quot;1334&quot;&gt;어떤 함수 +&lt;br /&gt;그 함수가 호출한 &lt;b&gt;모든 하위 함수&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1393&quot; data-start=&quot;1371&quot;&gt;Flamegraph의 &lt;b&gt;가로 폭&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1421&quot; data-start=&quot;1395&quot; data-ke-size=&quot;size23&quot;&gt;Exclusive Cost (자기 비용)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1485&quot; data-start=&quot;1423&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1443&quot; data-start=&quot;1423&quot;&gt;해당 함수 &lt;b&gt;자체 실행 시간&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1469&quot; data-start=&quot;1444&quot;&gt;Flamegraph에서는 직접 보이지 않음&lt;/li&gt;
&lt;li data-end=&quot;1485&quot; data-start=&quot;1470&quot;&gt;툴팁이나 diff로 해석&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1490&quot; data-start=&quot;1487&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1504&quot; data-start=&quot;1492&quot; data-ke-size=&quot;size23&quot;&gt;예시 사고 흐름&lt;/h3&gt;
&lt;pre id=&quot;code_1766056323543&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A()
 └─ B()
     └─ C()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1607&quot; data-start=&quot;1543&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1575&quot; data-start=&quot;1543&quot;&gt;C가 느리면&lt;br /&gt;&amp;rarr; A, B, C 모두 넓게 보인다&lt;/li&gt;
&lt;li data-end=&quot;1607&quot; data-start=&quot;1576&quot;&gt;A가 넓다고 해서&lt;br /&gt;&amp;rarr; A가 문제인 것은 아니다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1612&quot; data-start=&quot;1609&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1638&quot; data-start=&quot;1614&quot; data-ke-size=&quot;size26&quot;&gt;Flamegraph를 읽는 올바른 순서&lt;/h2&gt;
&lt;p data-end=&quot;1678&quot; data-start=&quot;1640&quot; data-ke-size=&quot;size16&quot;&gt;많은 사람들이 &lt;b&gt;위에서 아래로&lt;/b&gt; 본다.&lt;br /&gt;하지만 정답은 반대다.&lt;/p&gt;
&lt;h3 data-end=&quot;1696&quot; data-start=&quot;1680&quot; data-ke-size=&quot;size23&quot;&gt;1단계: 바닥부터 본다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1784&quot; data-start=&quot;1698&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1714&quot; data-start=&quot;1698&quot;&gt;맨 아래 함수는 무엇인가?&lt;/li&gt;
&lt;li data-end=&quot;1784&quot; data-start=&quot;1715&quot;&gt;entry point는 어디인가?
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1784&quot; data-start=&quot;1738&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1748&quot; data-start=&quot;1738&quot;&gt;syscall?&lt;/li&gt;
&lt;li data-end=&quot;1757&quot; data-start=&quot;1751&quot;&gt;런타임?&lt;/li&gt;
&lt;li data-end=&quot;1784&quot; data-start=&quot;1760&quot;&gt;application main loop?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1789&quot; data-start=&quot;1786&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1812&quot; data-start=&quot;1791&quot; data-ke-size=&quot;size23&quot;&gt;2단계: 넓은 &amp;ldquo;기둥&amp;rdquo;을 찾는다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1872&quot; data-start=&quot;1814&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1850&quot; data-start=&quot;1814&quot;&gt;특정 함수 위로&lt;br /&gt;&lt;b&gt;지속적으로 넓은 폭이 유지되는가&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1872&quot; data-start=&quot;1851&quot;&gt;중간에 폭이 갑자기 좁아지지 않는가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1877&quot; data-start=&quot;1874&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1897&quot; data-start=&quot;1879&quot; data-ke-size=&quot;size23&quot;&gt;3단계: 분기 지점을 본다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1942&quot; data-start=&quot;1899&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1924&quot; data-start=&quot;1899&quot;&gt;한 함수에서&lt;br /&gt;여러 갈래로 나뉘는가?&lt;/li&gt;
&lt;li data-end=&quot;1942&quot; data-start=&quot;1925&quot;&gt;특정 분기만 유난히 넓은가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1964&quot; data-start=&quot;1944&quot; data-ke-size=&quot;size16&quot;&gt;이 지점이 &lt;b&gt;의사결정 포인트&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-end=&quot;1969&quot; data-start=&quot;1966&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1993&quot; data-start=&quot;1971&quot; data-ke-size=&quot;size26&quot;&gt;커널 스택 vs 유저 스택 구분하기&lt;/h2&gt;
&lt;p data-end=&quot;2050&quot; data-start=&quot;1995&quot; data-ke-size=&quot;size16&quot;&gt;Parca Flamegraph의 강력한 점은&lt;br /&gt;&lt;b&gt;커널과 유저 스택을 함께 보여준다는 것&lt;/b&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;2055&quot; data-start=&quot;2052&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2077&quot; data-start=&quot;2057&quot; data-ke-size=&quot;size23&quot;&gt;커널 함수가 넓게 보이는 경우&lt;/h3&gt;
&lt;pre id=&quot;code_1766056353695&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;__schedule()
mutex_lock()
futex_wait()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2151&quot; data-start=&quot;2131&quot; data-ke-size=&quot;size16&quot;&gt;의미하는 바는 보통 다음 중 하나다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2199&quot; data-start=&quot;2153&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2159&quot; data-start=&quot;2153&quot;&gt;락 경합&lt;/li&gt;
&lt;li data-end=&quot;2168&quot; data-start=&quot;2160&quot;&gt;스레드 대기&lt;/li&gt;
&lt;li data-end=&quot;2178&quot; data-start=&quot;2169&quot;&gt;스케줄링 지연&lt;/li&gt;
&lt;li data-end=&quot;2199&quot; data-start=&quot;2179&quot;&gt;과도한 context switch&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2230&quot; data-start=&quot;2201&quot; data-ke-size=&quot;size16&quot;&gt;이 경우 &lt;b&gt;애플리케이션 코드만 보면 답이 없다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;2235&quot; data-start=&quot;2232&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2257&quot; data-start=&quot;2237&quot; data-ke-size=&quot;size23&quot;&gt;유저 함수가 넓게 보이는 경우&lt;/h3&gt;
&lt;pre id=&quot;code_1766056376558&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;parse_json()
custom_hash_lookup()
compress_block()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2338&quot; data-start=&quot;2323&quot; data-ke-size=&quot;size16&quot;&gt;이 경우는 비교적 단순하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2379&quot; data-start=&quot;2340&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2349&quot; data-start=&quot;2340&quot;&gt;알고리즘 문제&lt;/li&gt;
&lt;li data-end=&quot;2361&quot; data-start=&quot;2350&quot;&gt;데이터 구조 문제&lt;/li&gt;
&lt;li data-end=&quot;2369&quot; data-start=&quot;2362&quot;&gt;캐시 미스&lt;/li&gt;
&lt;li data-end=&quot;2379&quot; data-start=&quot;2370&quot;&gt;불필요한 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2384&quot; data-start=&quot;2381&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2398&quot; data-start=&quot;2386&quot; data-ke-size=&quot;size26&quot;&gt;실전 예제 ①&lt;/h2&gt;
&lt;h3 data-end=&quot;2426&quot; data-start=&quot;2399&quot; data-ke-size=&quot;size23&quot;&gt;&amp;ldquo;CPU 사용률은 높은데, 일은 안 한다&amp;rdquo;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EJs4V/dJMcai9Gopi/9syxRK8evbJO0TqkkAqzzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EJs4V/dJMcai9Gopi/9syxRK8evbJO0TqkkAqzzk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EJs4V/dJMcai9Gopi/9syxRK8evbJO0TqkkAqzzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEJs4V%2FdJMcai9Gopi%2F9syxRK8evbJO0TqkkAqzzk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;290&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9mUex/dJMcadN3SzX/z5Le2jmb7LXKghRzpsQK3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9mUex/dJMcadN3SzX/z5Le2jmb7LXKghRzpsQK3k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9mUex/dJMcadN3SzX/z5Le2jmb7LXKghRzpsQK3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9mUex%2FdJMcadN3SzX%2Fz5Le2jmb7LXKghRzpsQK3k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1200&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;2487&quot; data-start=&quot;2470&quot; data-ke-size=&quot;size23&quot;&gt;Flamegraph 특징&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2548&quot; data-start=&quot;2489&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2514&quot; data-start=&quot;2489&quot;&gt;__schedule() 폭이 매우 넓음&lt;/li&gt;
&lt;li data-end=&quot;2530&quot; data-start=&quot;2515&quot;&gt;여러 경로에서 반복 등장&lt;/li&gt;
&lt;li data-end=&quot;2548&quot; data-start=&quot;2531&quot;&gt;유저 함수는 상대적으로 얇음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2556&quot; data-start=&quot;2550&quot; data-ke-size=&quot;size23&quot;&gt;해석&lt;/h3&gt;
&lt;blockquote data-end=&quot;2590&quot; data-start=&quot;2558&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2590&quot; data-start=&quot;2560&quot; data-ke-size=&quot;size16&quot;&gt;CPU는 바쁘지만&lt;br /&gt;실제 계산은 거의 하지 않는다&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2606&quot; data-start=&quot;2592&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;락/동기화 문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2630&quot; data-start=&quot;2608&quot; data-ke-size=&quot;size16&quot;&gt;APM으로는 거의 잡히지 않는 유형이다.&lt;/p&gt;
&lt;hr data-end=&quot;2635&quot; data-start=&quot;2632&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2649&quot; data-start=&quot;2637&quot; data-ke-size=&quot;size26&quot;&gt;실전 예제 ②&lt;/h2&gt;
&lt;h3 data-end=&quot;2669&quot; data-start=&quot;2650&quot; data-ke-size=&quot;size23&quot;&gt;&amp;ldquo;특정 배포 이후 느려졌다&amp;rdquo;&lt;/h3&gt;
&lt;p data-end=&quot;2706&quot; data-start=&quot;2671&quot; data-ke-size=&quot;size16&quot;&gt;이럴 때 Parca의 진가는 **비교(diff)**에서 나온다.&lt;/p&gt;
&lt;hr data-end=&quot;2711&quot; data-start=&quot;2708&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2736&quot; data-start=&quot;2713&quot; data-ke-size=&quot;size23&quot;&gt;Diff Flamegraph의 의미&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2773&quot; data-start=&quot;2738&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2755&quot; data-start=&quot;2738&quot;&gt;빨간색: 증가한 CPU 경로&lt;/li&gt;
&lt;li data-end=&quot;2773&quot; data-start=&quot;2756&quot;&gt;파란색: 감소한 CPU 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1766056446697&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;custom_hash_lookup() +12%
old_cache_lookup()   -8%&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2882&quot; data-start=&quot;2839&quot; data-ke-size=&quot;size16&quot;&gt;이 한 화면으로&lt;br /&gt;**성능 회귀(regression)**를 설명할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2887&quot; data-start=&quot;2884&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2915&quot; data-start=&quot;2889&quot; data-ke-size=&quot;size26&quot;&gt;Flamegraph는 &amp;ldquo;원인 후보 지도&amp;rdquo;다&lt;/h2&gt;
&lt;p data-end=&quot;2933&quot; data-start=&quot;2917&quot; data-ke-size=&quot;size16&quot;&gt;중요한 관점 하나를 강조하자.&lt;/p&gt;
&lt;blockquote data-end=&quot;2989&quot; data-start=&quot;2935&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2989&quot; data-start=&quot;2937&quot; data-ke-size=&quot;size16&quot;&gt;Flamegraph는&lt;br /&gt;&amp;ldquo;정답&amp;rdquo;을 알려주지 않는다&lt;br /&gt;&lt;b&gt;&amp;ldquo;의심 지점&amp;rdquo;을 알려준다&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3031&quot; data-start=&quot;2991&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2999&quot; data-start=&quot;2991&quot;&gt;왜 넓은가?&lt;/li&gt;
&lt;li data-end=&quot;3016&quot; data-start=&quot;3000&quot;&gt;왜 이 경로가 많아졌는가?&lt;/li&gt;
&lt;li data-end=&quot;3031&quot; data-start=&quot;3017&quot;&gt;왜 이전에는 없었는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3055&quot; data-start=&quot;3033&quot; data-ke-size=&quot;size16&quot;&gt;이 질문은&lt;br /&gt;&lt;b&gt;사람이 해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;3060&quot; data-start=&quot;3057&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3086&quot; data-start=&quot;3062&quot; data-ke-size=&quot;size26&quot;&gt;Parca UI에서 꼭 봐야 할 포인트&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3186&quot; data-start=&quot;3088&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3103&quot; data-start=&quot;3088&quot;&gt;시간 범위를 좁혀서 본다&lt;/li&gt;
&lt;li data-end=&quot;3118&quot; data-start=&quot;3104&quot;&gt;배포 시점 전/후 비교&lt;/li&gt;
&lt;li data-end=&quot;3157&quot; data-start=&quot;3119&quot;&gt;label(node, pod, container) 필터 적극 활용&lt;/li&gt;
&lt;li data-end=&quot;3186&quot; data-start=&quot;3158&quot;&gt;하나의 Flamegraph로 결론 내리지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3191&quot; data-start=&quot;3188&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3211&quot; data-start=&quot;3193&quot; data-ke-size=&quot;size26&quot;&gt;자주 하는 치명적 실수 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3292&quot; data-start=&quot;3213&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3232&quot; data-start=&quot;3213&quot;&gt;❌ &amp;ldquo;위에 있는 함수 = 범인&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;3258&quot; data-start=&quot;3233&quot;&gt;❌ &amp;ldquo;한 장의 Flamegraph로 결론&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;3271&quot; data-start=&quot;3259&quot;&gt;❌ 커널 스택 무시&lt;/li&gt;
&lt;li data-end=&quot;3292&quot; data-start=&quot;3272&quot;&gt;❌ 폭이 좁은데 이름만 보고 의심&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3297&quot; data-start=&quot;3294&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3309&quot; data-start=&quot;3299&quot; data-ke-size=&quot;size26&quot;&gt;이 편의 결론&lt;/h2&gt;
&lt;p data-end=&quot;3338&quot; data-start=&quot;3311&quot; data-ke-size=&quot;size16&quot;&gt;Flamegraph를 제대로 읽을 수 있게 되면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3420&quot; data-start=&quot;3340&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3361&quot; data-start=&quot;3340&quot;&gt;CPU 사용률 숫자는 의미를 잃는다&lt;/li&gt;
&lt;li data-end=&quot;3389&quot; data-start=&quot;3362&quot;&gt;&amp;ldquo;느리다&amp;rdquo;는 말을 &lt;b&gt;설명&lt;/b&gt;할 수 있게 된다&lt;/li&gt;
&lt;li data-end=&quot;3420&quot; data-start=&quot;3390&quot;&gt;성능 문제 논의가 감정이 아니라 &lt;b&gt;근거&lt;/b&gt;가 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;3470&quot; data-start=&quot;3422&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3470&quot; data-start=&quot;3424&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Parca의 가치는&lt;br /&gt;Flamegraph를 이해하는 순간부터 시작된다.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;3475&quot; data-start=&quot;3472&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3487&quot; data-start=&quot;3477&quot; data-ke-size=&quot;size26&quot;&gt;다음 편 예고&lt;/h2&gt;
&lt;p data-end=&quot;3557&quot; data-start=&quot;3489&quot; data-ke-size=&quot;size16&quot;&gt;다음 편에서는&lt;br /&gt;Flamegraph를 실제 &lt;b&gt;장애&amp;middot;성능 이슈&lt;/b&gt;에 적용하는&lt;br /&gt;&lt;b&gt;실전 사례 중심 편&lt;/b&gt;으로 넘어간다.&lt;/p&gt;
&lt;hr data-end=&quot;3562&quot; data-start=&quot;3559&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3574&quot; data-start=&quot;3564&quot; data-ke-size=&quot;size23&quot;&gt;다음 편&lt;/h3&gt;
&lt;p data-end=&quot;3617&quot; data-start=&quot;3575&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6편. 실전 사례 ① &amp;ndash; CPU 사용률은 정상인데, 성능은 느린 이유&lt;/b&gt;&lt;/p&gt;</description>
      <category>Parca</category>
      <category>BPF</category>
      <category>ebpf</category>
      <category>observability</category>
      <category>parca</category>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/5</guid>
      <comments>https://overfrost.tistory.com/5#entry5comment</comments>
      <pubDate>Thu, 18 Dec 2025 20:15:05 +0900</pubDate>
    </item>
    <item>
      <title>4편. Parca와 기존 APM / 모니터링 에이전트 비교&amp;ndash; 무엇이 같고, 무엇이 다른가</title>
      <link>https://overfrost.tistory.com/4</link>
      <description>&lt;h1 data-end=&quot;244&quot; data-start=&quot;212&quot;&gt;Parca와 기존 APM / 모니터링 에이전트 비교&lt;/h1&gt;
&lt;h2 data-end=&quot;263&quot; data-start=&quot;245&quot; data-ke-size=&quot;size26&quot;&gt;무엇이 같고, 무엇이 다른가&lt;/h2&gt;
&lt;p data-end=&quot;295&quot; data-start=&quot;265&quot; data-ke-size=&quot;size16&quot;&gt;Parca를 처음 접하면 많은 사람들이 이렇게 묻는다.&lt;/p&gt;
&lt;blockquote data-end=&quot;347&quot; data-start=&quot;297&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;347&quot; data-start=&quot;299&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;이거 APM이랑 뭐가 다른가요?&amp;rdquo;&lt;br /&gt;&amp;ldquo;기존 모니터링 에이전트랑 겹치지 않나요?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;426&quot; data-start=&quot;349&quot; data-ke-size=&quot;size16&quot;&gt;이 질문은 매우 자연스럽다.&lt;br /&gt;그리고 이 질문에 제대로 답하지 못하면&lt;br /&gt;&lt;b&gt;Parca는 &amp;lsquo;굳이 써야 하나?&amp;rsquo;라는 도구로 남게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;491&quot; data-start=&quot;428&quot; data-ke-size=&quot;size16&quot;&gt;이번 편에서는&lt;br /&gt;Parca, APM, 전통적 모니터링 에이전트를&lt;br /&gt;&lt;b&gt;같은 테이블 위에 올려놓고&lt;/b&gt; 비교한다.&lt;/p&gt;
&lt;hr data-end=&quot;496&quot; data-start=&quot;493&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;513&quot; data-start=&quot;498&quot; data-ke-size=&quot;size26&quot;&gt;먼저 한 문장 요약부터&lt;/h2&gt;
&lt;blockquote data-end=&quot;598&quot; data-start=&quot;515&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;598&quot; data-start=&quot;517&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;APM은 &amp;lsquo;요청&amp;rsquo;을 본다&lt;/b&gt;&lt;br /&gt;&lt;b&gt;모니터링 에이전트는 &amp;lsquo;자원&amp;rsquo;을 본다&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Parca는 &amp;lsquo;CPU 시간의 실제 사용처&amp;rsquo;를 본다&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;634&quot; data-start=&quot;600&quot; data-ke-size=&quot;size16&quot;&gt;이 문장을 이해하면&lt;br /&gt;이번 글의 절반은 이미 이해한 셈이다.&lt;/p&gt;
&lt;hr data-end=&quot;639&quot; data-start=&quot;636&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;652&quot; data-start=&quot;641&quot; data-ke-size=&quot;size26&quot;&gt;비교 대상 정리&lt;/h2&gt;
&lt;p data-end=&quot;678&quot; data-start=&quot;654&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서 비교할 대상은 다음 세 가지다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;906&quot; data-start=&quot;680&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;777&quot; data-start=&quot;680&quot;&gt;&lt;b&gt;전통적 모니터링 에이전트&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;777&quot; data-start=&quot;704&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;732&quot; data-start=&quot;704&quot;&gt;CPU, Memory, Disk, Network&lt;/li&gt;
&lt;li data-end=&quot;777&quot; data-start=&quot;736&quot;&gt;node_exporter, collectd, custom agent 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;869&quot; data-start=&quot;779&quot;&gt;&lt;b&gt;APM (Application Performance Monitoring)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;869&quot; data-start=&quot;830&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;869&quot; data-start=&quot;830&quot;&gt;New Relic, Datadog APM, Elastic APM 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;906&quot; data-start=&quot;871&quot;&gt;&lt;b&gt;Parca (Continuous Profiling)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;911&quot; data-start=&quot;908&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;933&quot; data-start=&quot;913&quot; data-ke-size=&quot;size26&quot;&gt;관점 1: &amp;ldquo;무엇을 관측하는가&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzM73x/dJMcadHjtqM/qyFJC3fKkQ2DKJmkfeyDUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzM73x/dJMcadHjtqM/qyFJC3fKkQ2DKJmkfeyDUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzM73x/dJMcadHjtqM/qyFJC3fKkQ2DKJmkfeyDUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzM73x%2FdJMcadHjtqM%2FqyFJC3fKkQ2DKJmkfeyDUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;373&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjoMeD/dJMcabitrgC/zEBmpXj7tEoTbRVY91w1b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjoMeD/dJMcabitrgC/zEBmpXj7tEoTbRVY91w1b1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjoMeD/dJMcabitrgC/zEBmpXj7tEoTbRVY91w1b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjoMeD%2FdJMcabitrgC%2FzEBmpXj7tEoTbRVY91w1b1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2320&quot; height=&quot;1723&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1723&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.webp&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;953&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nZSk3/dJMcaaKCLeD/qnpNDbSyrPRvSmgkW1ktz1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nZSk3/dJMcaaKCLeD/qnpNDbSyrPRvSmgkW1ktz1/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nZSk3/dJMcaaKCLeD/qnpNDbSyrPRvSmgkW1ktz1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnZSk3%2FdJMcaaKCLeD%2FqnpNDbSyrPRvSmgkW1ktz1%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1844&quot; height=&quot;953&quot; data-filename=&quot;3.webp&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;953&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;994&quot; data-start=&quot;977&quot; data-ke-size=&quot;size23&quot;&gt;전통적 모니터링 에이전트&lt;/h3&gt;
&lt;p data-end=&quot;1015&quot; data-start=&quot;996&quot; data-ke-size=&quot;size16&quot;&gt;관측 대상은 &lt;b&gt;리소스 수치&lt;/b&gt;다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1090&quot; data-start=&quot;1017&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1030&quot; data-start=&quot;1017&quot;&gt;CPU 사용률 (%)&lt;/li&gt;
&lt;li data-end=&quot;1045&quot; data-start=&quot;1031&quot;&gt;Load Average&lt;/li&gt;
&lt;li data-end=&quot;1058&quot; data-start=&quot;1046&quot;&gt;Memory 사용량&lt;/li&gt;
&lt;li data-end=&quot;1069&quot; data-start=&quot;1059&quot;&gt;Disk I/O&lt;/li&gt;
&lt;li data-end=&quot;1090&quot; data-start=&quot;1070&quot;&gt;Network throughput&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1095&quot; data-start=&quot;1092&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre id=&quot;code_1766055714062&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CPU usage: 82%
Load average: 5.6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1163&quot; data-start=&quot;1143&quot; data-ke-size=&quot;size16&quot;&gt;하지만 여기에는 중요한 정보가 없다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1186&quot; data-start=&quot;1165&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1186&quot; data-start=&quot;1167&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;82%가 왜 발생했는가?&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1191&quot; data-start=&quot;1188&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1200&quot; data-start=&quot;1193&quot; data-ke-size=&quot;size23&quot;&gt;APM&lt;/h3&gt;
&lt;p data-end=&quot;1228&quot; data-start=&quot;1202&quot; data-ke-size=&quot;size16&quot;&gt;APM은 &lt;b&gt;요청(Request) 중심&lt;/b&gt;이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1274&quot; data-start=&quot;1230&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1242&quot; data-start=&quot;1230&quot;&gt;트랜잭션 응답 시간&lt;/li&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1243&quot;&gt;API별 latency&lt;/li&gt;
&lt;li data-end=&quot;1268&quot; data-start=&quot;1258&quot;&gt;DB 쿼리 시간&lt;/li&gt;
&lt;li data-end=&quot;1274&quot; data-start=&quot;1269&quot;&gt;에러율&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1284&quot; data-start=&quot;1276&quot; data-ke-size=&quot;size16&quot;&gt;예시 (개념):&lt;/p&gt;
&lt;pre id=&quot;code_1766055740544&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;GET /api/order
  total: 420ms
    ├─ DB query: 210ms
    ├─ Cache lookup: 20ms
    └─ Business logic: 190ms&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;1424&quot; data-start=&quot;1407&quot; data-ke-size=&quot;size16&quot;&gt;APM은 다음 질문에는 강하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1455&quot; data-start=&quot;1426&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1440&quot; data-start=&quot;1426&quot;&gt;어떤 API가 느린가?&lt;/li&gt;
&lt;li data-end=&quot;1455&quot; data-start=&quot;1441&quot;&gt;어느 쿼리가 병목인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1472&quot; data-start=&quot;1457&quot; data-ke-size=&quot;size16&quot;&gt;하지만 이 질문에는 약하다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1510&quot; data-start=&quot;1474&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1510&quot; data-start=&quot;1476&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;그 190ms 동안 CPU는 &lt;b&gt;무엇을&lt;/b&gt; 하고 있었는가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1515&quot; data-start=&quot;1512&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1526&quot; data-start=&quot;1517&quot; data-ke-size=&quot;size23&quot;&gt;Parca&lt;/h3&gt;
&lt;p data-end=&quot;1550&quot; data-start=&quot;1528&quot; data-ke-size=&quot;size16&quot;&gt;Parca의 관측 대상은 완전히 다르다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1582&quot; data-start=&quot;1552&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1582&quot; data-start=&quot;1554&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CPU 시간이 실제로 소모된 함수 호출 경로&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1586&quot; data-start=&quot;1584&quot; data-ke-size=&quot;size16&quot;&gt;즉,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1619&quot; data-start=&quot;1588&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1594&quot; data-start=&quot;1588&quot;&gt;요청 ❌&lt;/li&gt;
&lt;li data-end=&quot;1605&quot; data-start=&quot;1595&quot;&gt;리소스 총량 ❌&lt;/li&gt;
&lt;li data-end=&quot;1619&quot; data-start=&quot;1606&quot;&gt;&lt;b&gt;실행 경로 ⭕&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1636&quot; data-start=&quot;1621&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 이렇게 말한다.&lt;/p&gt;
&lt;pre id=&quot;code_1766055772475&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CPU 시간의 27%는 함수 A
CPU 시간의 18%는 커널 스케줄링
CPU 시간의 12%는 lock contention&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;1722&quot; data-start=&quot;1719&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1742&quot; data-start=&quot;1724&quot; data-ke-size=&quot;size26&quot;&gt;관점 2: 수집 방식의 차이&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목모니터링 에이전트APMParca
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1915&quot; data-start=&quot;1744&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1915&quot; data-start=&quot;1795&quot;&gt;
&lt;tr data-end=&quot;1827&quot; data-start=&quot;1795&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1803&quot; data-start=&quot;1795&quot;&gt;수집 방식&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1812&quot; data-start=&quot;1803&quot;&gt;주기적 폴링&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1820&quot; data-start=&quot;1812&quot;&gt;코드 계측&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1827&quot; data-start=&quot;1820&quot;&gt;샘플링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1857&quot; data-start=&quot;1828&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1836&quot; data-start=&quot;1828&quot;&gt;개입 수준&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1841&quot; data-start=&quot;1836&quot;&gt;낮음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1848&quot; data-start=&quot;1841&quot;&gt;중~높음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1857&quot; data-start=&quot;1848&quot;&gt;매우 낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1886&quot; data-start=&quot;1858&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1866&quot; data-start=&quot;1858&quot;&gt;커널 관측&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1874&quot; data-start=&quot;1866&quot;&gt;거의 없음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1880&quot; data-start=&quot;1874&quot;&gt;제한적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1886&quot; data-start=&quot;1880&quot;&gt;핵심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1915&quot; data-start=&quot;1887&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1896&quot; data-start=&quot;1887&quot;&gt;상시 활성화&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1901&quot; data-start=&quot;1896&quot;&gt;가능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1909&quot; data-start=&quot;1901&quot;&gt;부담 있음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1915&quot; data-start=&quot;1909&quot;&gt;가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1920&quot; data-start=&quot;1917&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1952&quot; data-start=&quot;1922&quot; data-ke-size=&quot;size23&quot;&gt;APM의 코드 계측(Instrumenation)&lt;/h3&gt;
&lt;p data-end=&quot;1970&quot; data-start=&quot;1954&quot; data-ke-size=&quot;size16&quot;&gt;APM은 보통 이런 방식이다.&lt;/p&gt;
&lt;pre id=&quot;code_1766055810194&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Trace
public Order createOrder(...) {
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2065&quot; data-start=&quot;2034&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2042&quot; data-start=&quot;2034&quot;&gt;코드에 개입&lt;/li&gt;
&lt;li data-end=&quot;2053&quot; data-start=&quot;2043&quot;&gt;프레임워크 의존&lt;/li&gt;
&lt;li data-end=&quot;2065&quot; data-start=&quot;2054&quot;&gt;언어별 구현 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2076&quot; data-start=&quot;2067&quot; data-ke-size=&quot;size16&quot;&gt;장점은 명확하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2095&quot; data-start=&quot;2078&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2095&quot; data-start=&quot;2078&quot;&gt;비즈니스 흐름을 정확히 안다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2106&quot; data-start=&quot;2097&quot; data-ke-size=&quot;size16&quot;&gt;단점도 분명하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2150&quot; data-start=&quot;2108&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2130&quot; data-start=&quot;2108&quot;&gt;네이티브 코드, 커널 영역은 블랙박스&lt;/li&gt;
&lt;li data-end=&quot;2150&quot; data-start=&quot;2131&quot;&gt;계측이 많아질수록 오버헤드 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2155&quot; data-start=&quot;2152&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2174&quot; data-start=&quot;2157&quot; data-ke-size=&quot;size23&quot;&gt;Parca의 샘플링 방식&lt;/h3&gt;
&lt;p data-end=&quot;2199&quot; data-start=&quot;2176&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 코드를 전혀 수정하지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1766055839288&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;ldquo;지금 이 CPU는 어떤 스택 위에 있는가?&amp;rdquo;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2273&quot; data-start=&quot;2240&quot; data-ke-size=&quot;size16&quot;&gt;이 질문을&lt;br /&gt;&lt;b&gt;초당 수십 번, 무작위 시점에 묻는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2292&quot; data-start=&quot;2275&quot; data-ke-size=&quot;size16&quot;&gt;이 방식의 결과는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2330&quot; data-start=&quot;2294&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2304&quot; data-start=&quot;2294&quot;&gt;코드 수정 없음&lt;/li&gt;
&lt;li data-end=&quot;2313&quot; data-start=&quot;2305&quot;&gt;언어 독립적&lt;/li&gt;
&lt;li data-end=&quot;2330&quot; data-start=&quot;2314&quot;&gt;커널/유저 스택 모두 관측&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2335&quot; data-start=&quot;2332&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2356&quot; data-start=&quot;2337&quot; data-ke-size=&quot;size26&quot;&gt;관점 3: 문제 유형별 적합성&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co0Xit/dJMb99SuwFl/6uk13Ut7JJFWL30HjmKuuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co0Xit/dJMb99SuwFl/6uk13Ut7JJFWL30HjmKuuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co0Xit/dJMb99SuwFl/6uk13Ut7JJFWL30HjmKuuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco0Xit%2FdJMb99SuwFl%2F6uk13Ut7JJFWL30HjmKuuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1333&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1333&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J7xSE/dJMcacn8MQ6/m33IMktHf4KkkZufjeI0r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J7xSE/dJMcacn8MQ6/m33IMktHf4KkkZufjeI0r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J7xSE/dJMcacn8MQ6/m33IMktHf4KkkZufjeI0r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ7xSE%2FdJMcacn8MQ6%2Fm33IMktHf4KkkZufjeI0r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2320&quot; height=&quot;1723&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;2320&quot; data-origin-height=&quot;1723&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;2419&quot; data-start=&quot;2400&quot; data-ke-size=&quot;size23&quot;&gt;이런 문제는 APM이 강하다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2479&quot; data-start=&quot;2421&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2434&quot; data-start=&quot;2421&quot;&gt;특정 API가 느리다&lt;/li&gt;
&lt;li data-end=&quot;2448&quot; data-start=&quot;2435&quot;&gt;DB 쿼리가 병목이다&lt;/li&gt;
&lt;li data-end=&quot;2460&quot; data-start=&quot;2449&quot;&gt;에러율이 증가했다&lt;/li&gt;
&lt;li data-end=&quot;2479&quot; data-start=&quot;2461&quot;&gt;사용자 요청 흐름을 보고 싶다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2484&quot; data-start=&quot;2481&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2507&quot; data-start=&quot;2486&quot; data-ke-size=&quot;size23&quot;&gt;이런 문제는 Parca가 강하다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2626&quot; data-start=&quot;2509&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2532&quot; data-start=&quot;2509&quot;&gt;CPU 사용률은 높은데 이유를 모르겠다&lt;/li&gt;
&lt;li data-end=&quot;2557&quot; data-start=&quot;2533&quot;&gt;특정 배포 이후 성능이 애매하게 나빠졌다&lt;/li&gt;
&lt;li data-end=&quot;2592&quot; data-start=&quot;2558&quot;&gt;Lock, syscall, scheduling 이 의심된다&lt;/li&gt;
&lt;li data-end=&quot;2609&quot; data-start=&quot;2593&quot;&gt;커널 비중이 높은 서비스다&lt;/li&gt;
&lt;li data-end=&quot;2626&quot; data-start=&quot;2610&quot;&gt;&amp;ldquo;느린데 설명이 안 된다&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2631&quot; data-start=&quot;2628&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2644&quot; data-start=&quot;2633&quot; data-ke-size=&quot;size26&quot;&gt;실전 사례 비교&lt;/h2&gt;
&lt;h3 data-end=&quot;2652&quot; data-start=&quot;2646&quot; data-ke-size=&quot;size23&quot;&gt;상황&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2703&quot; data-start=&quot;2654&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2668&quot; data-start=&quot;2654&quot;&gt;CPU 사용률: 75%&lt;/li&gt;
&lt;li data-end=&quot;2685&quot; data-start=&quot;2669&quot;&gt;APM: 모든 API 정상&lt;/li&gt;
&lt;li data-end=&quot;2703&quot; data-start=&quot;2686&quot;&gt;사용자: &amp;ldquo;전체적으로 느림&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2708&quot; data-start=&quot;2705&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2725&quot; data-start=&quot;2710&quot; data-ke-size=&quot;size23&quot;&gt;APM이 보여주는 것&lt;/h3&gt;
&lt;pre id=&quot;code_1766055922262&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/api/search 평균 응답시간: 120ms (정상)
/api/order 평균 응답시간: 180ms (정상)
에러율: 0%&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2818&quot; data-start=&quot;2811&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 판단 불가&lt;/p&gt;
&lt;hr data-end=&quot;2823&quot; data-start=&quot;2820&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2842&quot; data-start=&quot;2825&quot; data-ke-size=&quot;size23&quot;&gt;Parca가 보여주는 것&lt;/h3&gt;
&lt;pre id=&quot;code_1766055945703&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CPU 시간 분포:
- __schedule(): 22%
- mutex_lock(): 17%
- custom_hash_lookup(): 14%&lt;/code&gt;&lt;/pre&gt;
&lt;p data-end=&quot;2959&quot; data-start=&quot;2936&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;락 경합으로 인한 스케줄링 병목&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2985&quot; data-start=&quot;2961&quot; data-ke-size=&quot;size16&quot;&gt;이 순간 Parca의 존재 이유가 드러난다.&lt;/p&gt;
&lt;hr data-end=&quot;2990&quot; data-start=&quot;2987&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3011&quot; data-start=&quot;2992&quot; data-ke-size=&quot;size26&quot;&gt;&amp;ldquo;중복되는 지표&amp;rdquo;에 대한 오해&lt;/h2&gt;
&lt;p data-end=&quot;3026&quot; data-start=&quot;3013&quot; data-ke-size=&quot;size16&quot;&gt;자주 나오는 말이 있다.&lt;/p&gt;
&lt;blockquote data-end=&quot;3055&quot; data-start=&quot;3028&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3055&quot; data-start=&quot;3030&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;CPU 사용률은 기존 에이전트도 보잖아요?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3092&quot; data-start=&quot;3057&quot; data-ke-size=&quot;size16&quot;&gt;맞다.&lt;br /&gt;하지만 &lt;b&gt;&amp;lsquo;사용률&amp;rsquo;과 &amp;lsquo;사용처&amp;rsquo;는 전혀 다르다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3131&quot; data-start=&quot;3094&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3105&quot; data-start=&quot;3094&quot;&gt;CPU 80% ❌&lt;/li&gt;
&lt;li data-end=&quot;3131&quot; data-start=&quot;3106&quot;&gt;CPU 80% 중 무엇이 80%인가 ⭕&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3191&quot; data-start=&quot;3133&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 &lt;b&gt;지표를 하나 더 추가하는 도구가 아니다.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;차원을 하나 더 추가하는 도구&lt;/b&gt;다.&lt;/p&gt;
&lt;hr data-end=&quot;3196&quot; data-start=&quot;3193&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3220&quot; data-start=&quot;3198&quot; data-ke-size=&quot;size26&quot;&gt;Parca는 무엇을 대체하지 않는다&lt;/h2&gt;
&lt;p data-end=&quot;3234&quot; data-start=&quot;3222&quot; data-ke-size=&quot;size16&quot;&gt;다시 한 번 강조하자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3314&quot; data-start=&quot;3236&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3258&quot; data-start=&quot;3236&quot;&gt;Parca는 APM을 대체하지 않는다&lt;/li&gt;
&lt;li data-end=&quot;3288&quot; data-start=&quot;3259&quot;&gt;Parca는 Prometheus를 대체하지 않는다&lt;/li&gt;
&lt;li data-end=&quot;3314&quot; data-start=&quot;3289&quot;&gt;Parca는 로그 시스템을 대체하지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3340&quot; data-start=&quot;3316&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 이렇게 쓰일 때 가장 강력하다.&lt;/p&gt;
&lt;pre id=&quot;code_1766055978025&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Metrics  &amp;rarr; &amp;ldquo;문제가 있다&amp;rdquo;
APM      &amp;rarr; &amp;ldquo;요청은 정상이다&amp;rdquo;
Parca    &amp;rarr; &amp;ldquo;CPU는 여기서 막히고 있다&amp;rdquo;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-end=&quot;3447&quot; data-start=&quot;3427&quot; data-ke-size=&quot;size26&quot;&gt;함께 쓸 때 가장 이상적인 조합&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;목적도구
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3573&quot; data-start=&quot;3449&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3573&quot; data-start=&quot;3471&quot;&gt;
&lt;tr data-end=&quot;3510&quot; data-start=&quot;3471&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3480&quot; data-start=&quot;3471&quot;&gt;시스템 상태&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3510&quot; data-start=&quot;3480&quot;&gt;Prometheus / node exporter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3526&quot; data-start=&quot;3511&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3519&quot; data-start=&quot;3511&quot;&gt;요청 분석&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3526&quot; data-start=&quot;3519&quot;&gt;APM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3545&quot; data-start=&quot;3527&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3536&quot; data-start=&quot;3527&quot;&gt;CPU 병목&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3545&quot; data-start=&quot;3536&quot;&gt;Parca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3573&quot; data-start=&quot;3546&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3554&quot; data-start=&quot;3546&quot;&gt;원인 확증&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3573&quot; data-start=&quot;3554&quot;&gt;perf / bpftrace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3603&quot; data-start=&quot;3575&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 **&amp;ldquo;마지막 퍼즐 조각&amp;rdquo;**에 가깝다.&lt;/p&gt;
&lt;hr data-end=&quot;3608&quot; data-start=&quot;3605&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3620&quot; data-start=&quot;3610&quot; data-ke-size=&quot;size26&quot;&gt;이 편의 결론&lt;/h2&gt;
&lt;p data-end=&quot;3629&quot; data-start=&quot;3622&quot; data-ke-size=&quot;size16&quot;&gt;Parca는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3713&quot; data-start=&quot;3631&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3652&quot; data-start=&quot;3631&quot;&gt;모든 문제를 해결하는 도구가 아니다&lt;/li&gt;
&lt;li data-end=&quot;3679&quot; data-start=&quot;3653&quot;&gt;하지만 &lt;b&gt;특정 문제에는 대체 불가능&lt;/b&gt;하다&lt;/li&gt;
&lt;li data-end=&quot;3713&quot; data-start=&quot;3680&quot;&gt;특히 시스템 프로그래머, 플랫폼 팀, SRE에게 강력하다&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-end=&quot;3761&quot; data-start=&quot;3715&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3761&quot; data-start=&quot;3717&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;왜 느린지 설명할 수 있을 때,&lt;br /&gt;비로소 성능 문제는 해결된다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3794&quot; data-start=&quot;3763&quot; data-ke-size=&quot;size16&quot;&gt;Parca는&lt;br /&gt;그 &amp;ldquo;설명&amp;rdquo;을 가능하게 해 주는 도구다.&lt;/p&gt;
&lt;hr data-end=&quot;3799&quot; data-start=&quot;3796&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3811&quot; data-start=&quot;3801&quot; data-ke-size=&quot;size26&quot;&gt;다음 편 예고&lt;/h2&gt;
&lt;p data-end=&quot;3858&quot; data-start=&quot;3813&quot; data-ke-size=&quot;size16&quot;&gt;다음 편에서는&lt;br /&gt;Parca의 핵심 결과물인 &lt;b&gt;Flamegraph&lt;/b&gt;를 다룬다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3945&quot; data-start=&quot;3860&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3883&quot; data-start=&quot;3860&quot;&gt;Flamegraph는 왜 이런 모양인가&lt;/li&gt;
&lt;li data-end=&quot;3900&quot; data-start=&quot;3884&quot;&gt;X축과 Y축의 정확한 의미&lt;/li&gt;
&lt;li data-end=&quot;3927&quot; data-start=&quot;3901&quot;&gt;Inclusive / Exclusive 비용&lt;/li&gt;
&lt;li data-end=&quot;3945&quot; data-start=&quot;3928&quot;&gt;흔히 저지르는 치명적인 오해&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3950&quot; data-start=&quot;3947&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3962&quot; data-start=&quot;3952&quot; data-ke-size=&quot;size23&quot;&gt;다음 편&lt;/h3&gt;
&lt;p data-end=&quot;4006&quot; data-start=&quot;3963&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5편. Flamegraph 제대로 읽기 &amp;ndash; Parca UI 해석 가이드&lt;/b&gt;&lt;/p&gt;</description>
      <category>Parca</category>
      <category>BPF</category>
      <category>ebpf</category>
      <category>observability</category>
      <category>parca</category>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/4</guid>
      <comments>https://overfrost.tistory.com/4#entry4comment</comments>
      <pubDate>Thu, 18 Dec 2025 20:08:03 +0900</pubDate>
    </item>
    <item>
      <title>3편. parca-agent 내부 구조 분석 &amp;ndash; eBPF 기반 수집 메커니즘</title>
      <link>https://overfrost.tistory.com/3</link>
      <description>&lt;h1 data-end=&quot;231&quot; data-start=&quot;207&quot;&gt;parca-agent 내부 구조 분석&lt;/h1&gt;
&lt;h2 data-end=&quot;250&quot; data-start=&quot;232&quot; data-ke-size=&quot;size26&quot;&gt;eBPF 기반 수집 메커니즘&lt;/h2&gt;
&lt;p data-end=&quot;340&quot; data-start=&quot;252&quot; data-ke-size=&quot;size16&quot;&gt;Parca를 &amp;ldquo;설치해 보는 도구&amp;rdquo;가 아니라&lt;br /&gt;&lt;b&gt;신뢰할 수 있는 성능 분석 도구&lt;/b&gt;로 받아들이기 위해서는&lt;br /&gt;반드시 한 번은 짚고 넘어가야 할 질문이 있다.&lt;/p&gt;
&lt;blockquote data-end=&quot;400&quot; data-start=&quot;342&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;400&quot; data-start=&quot;344&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent는 &lt;b&gt;정확히 무엇을,&lt;br /&gt;어떤 방식으로,&lt;br /&gt;얼마나 자주 수집하는가?&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;420&quot; data-start=&quot;402&quot; data-ke-size=&quot;size16&quot;&gt;이번 편에서는 이 질문에 답한다.&lt;/p&gt;
&lt;hr data-end=&quot;425&quot; data-start=&quot;422&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;451&quot; data-start=&quot;427&quot; data-ke-size=&quot;size26&quot;&gt;parca-agent의 역할 다시 정리&lt;/h2&gt;
&lt;p data-end=&quot;470&quot; data-start=&quot;453&quot; data-ke-size=&quot;size16&quot;&gt;먼저 역할을 다시 명확히 하자.&lt;/p&gt;
&lt;p data-end=&quot;485&quot; data-start=&quot;472&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;543&quot; data-start=&quot;487&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;506&quot; data-start=&quot;487&quot;&gt;CPU 사용량을 계산하지 않는다&lt;/li&gt;
&lt;li data-end=&quot;521&quot; data-start=&quot;507&quot;&gt;병목을 판단하지 않는다&lt;/li&gt;
&lt;li data-end=&quot;543&quot; data-start=&quot;522&quot;&gt;Flamegraph를 만들지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;570&quot; data-start=&quot;545&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent가 하는 일은 단 하나다.&lt;/p&gt;
&lt;blockquote data-end=&quot;612&quot; data-start=&quot;572&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;612&quot; data-start=&quot;574&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;CPU가 인터럽트된 순간의&lt;br /&gt;실행 스택을 샘플링한다.&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;643&quot; data-start=&quot;614&quot; data-ke-size=&quot;size16&quot;&gt;모든 분석은&lt;br /&gt;이 단순한 행위의 반복 위에 쌓인다.&lt;/p&gt;
&lt;hr data-end=&quot;648&quot; data-start=&quot;645&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;668&quot; data-start=&quot;650&quot; data-ke-size=&quot;size26&quot;&gt;전체 수집 흐름 한눈에 보기&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WcTCs/dJMcaiICnOK/cpMvNlGDSH9G9B6Ej1hhx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WcTCs/dJMcaiICnOK/cpMvNlGDSH9G9B6Ej1hhx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WcTCs/dJMcaiICnOK/cpMvNlGDSH9G9B6Ej1hhx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWcTCs%2FdJMcaiICnOK%2FcpMvNlGDSH9G9B6Ej1hhx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1249&quot; height=&quot;658&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caKz3j/dJMcafkRE4N/0hh22d2LdXMckKK8KvUNBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caKz3j/dJMcafkRE4N/0hh22d2LdXMckKK8KvUNBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caKz3j/dJMcafkRE4N/0hh22d2LdXMckKK8KvUNBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaKz3j%2FdJMcafkRE4N%2F0hh22d2LdXMckKK8KvUNBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;896&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ub3J6/dJMcacBGhtk/dtMqSDZHG323CMF2KmdOZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ub3J6/dJMcacBGhtk/dtMqSDZHG323CMF2KmdOZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ub3J6/dJMcacBGhtk/dtMqSDZHG323CMF2KmdOZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fub3J6%2FdJMcacBGhtk%2FdtMqSDZHG323CMF2KmdOZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1218&quot; height=&quot;646&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;parca-agent의 내부 동작을 흐름으로 단순화하면 다음과 같다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 34.3023%; height: 314px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;CPU&amp;nbsp;주기적&amp;nbsp;인터럽트 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;perf_event&amp;nbsp;발생 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;eBPF&amp;nbsp;프로그램&amp;nbsp;실행 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;유저&amp;nbsp;스택&amp;nbsp;+&amp;nbsp;커널&amp;nbsp;스택&amp;nbsp;수집 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;stack&amp;nbsp;trace&amp;nbsp;ID&amp;nbsp;생성 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;user&amp;nbsp;space(agent)로&amp;nbsp;전달 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;protobuf&amp;nbsp;직렬화 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;darr; &lt;br /&gt;Parca&amp;nbsp;Server&amp;nbsp;전송 &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1013&quot; data-start=&quot;957&quot; data-ke-size=&quot;size16&quot;&gt;핵심은&lt;br /&gt;**&amp;ldquo;이 모든 과정이 커널 안전성 검증 하에서,&lt;br /&gt;짧은 시간 안에 끝난다&amp;rdquo;**는 점이다.&lt;/p&gt;
&lt;hr data-end=&quot;1018&quot; data-start=&quot;1015&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1040&quot; data-start=&quot;1020&quot; data-ke-size=&quot;size26&quot;&gt;perf_event 기반 샘플링&lt;/h2&gt;
&lt;h3 data-end=&quot;1071&quot; data-start=&quot;1042&quot; data-ke-size=&quot;size23&quot;&gt;왜 타이머가 아니라 perf_event 인가?&lt;/h3&gt;
&lt;p data-end=&quot;1138&quot; data-start=&quot;1073&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent는 CPU profiling을 위해&lt;br /&gt;Linux의 perf_event 서브시스템을 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;1157&quot; data-start=&quot;1140&quot; data-ke-size=&quot;size16&quot;&gt;이 방식의 장점은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1219&quot; data-start=&quot;1159&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1182&quot; data-start=&quot;1159&quot;&gt;하드웨어 성능 이벤트와 자연스럽게 연계&lt;/li&gt;
&lt;li data-end=&quot;1200&quot; data-start=&quot;1183&quot;&gt;커널 스케줄링과 정합성 유지&lt;/li&gt;
&lt;li data-end=&quot;1219&quot; data-start=&quot;1201&quot;&gt;이미 검증된 고성능 인터페이스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1235&quot; data-start=&quot;1221&quot; data-ke-size=&quot;size16&quot;&gt;개념적으로는 다음과 같다.&lt;/p&gt;
&lt;blockquote data-end=&quot;1278&quot; data-start=&quot;1237&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1278&quot; data-start=&quot;1239&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;CPU가 일정 주기마다&lt;br /&gt;&amp;lsquo;지금 뭐 하고 있니?&amp;rsquo; 하고 묻는다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1283&quot; data-start=&quot;1280&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1314&quot; data-start=&quot;1285&quot; data-ke-size=&quot;size23&quot;&gt;perf_event 설정 개념 예시 (단순화)&lt;/h3&gt;
&lt;pre id=&quot;code_1766054745445&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct perf_event_attr attr = {
    .type = PERF_TYPE_SOFTWARE,
    .config = PERF_COUNT_SW_CPU_CLOCK,
    .sample_freq = 19,
    .freq = 1,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1509&quot; data-start=&quot;1470&quot;&gt;sample_freq = 19&lt;br /&gt;&amp;rarr; 초당 약 19회 샘플링&lt;/li&gt;
&lt;li data-end=&quot;1561&quot; data-start=&quot;1510&quot;&gt;이 값이 parca-agent의 기본 철학을 보여준다&lt;br /&gt;(정밀함보다 &lt;b&gt;지속성&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1591&quot; data-start=&quot;1568&quot; data-ke-size=&quot;size26&quot;&gt;eBPF 프로그램은 언제 실행되는가?&lt;/h2&gt;
&lt;p data-end=&quot;1632&quot; data-start=&quot;1593&quot; data-ke-size=&quot;size16&quot;&gt;perf_event가 발생하면&lt;br /&gt;연결된 eBPF 프로그램이 실행된다.&lt;/p&gt;
&lt;p data-end=&quot;1661&quot; data-start=&quot;1634&quot; data-ke-size=&quot;size16&quot;&gt;이 eBPF 프로그램은 매우 짧고 단순해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;1672&quot; data-start=&quot;1663&quot; data-ke-size=&quot;size16&quot;&gt;이유는 명확하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1716&quot; data-start=&quot;1674&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1688&quot; data-start=&quot;1674&quot;&gt;커널 컨텍스트에서 실행&lt;/li&gt;
&lt;li data-end=&quot;1702&quot; data-start=&quot;1689&quot;&gt;verifier 제한&lt;/li&gt;
&lt;li data-end=&quot;1716&quot; data-start=&quot;1703&quot;&gt;실행 시간 상한 존재&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1721&quot; data-start=&quot;1718&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1740&quot; data-start=&quot;1723&quot; data-ke-size=&quot;size26&quot;&gt;스택 트레이스 수집의 핵심&lt;/h2&gt;
&lt;h3 data-end=&quot;1757&quot; data-start=&quot;1742&quot; data-ke-size=&quot;size23&quot;&gt;1. 커널 스택 수집&lt;/h3&gt;
&lt;p data-end=&quot;1775&quot; data-start=&quot;1759&quot; data-ke-size=&quot;size16&quot;&gt;커널 스택은 비교적 단순하다.&lt;/p&gt;
&lt;pre id=&quot;code_1766054783268&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bpf_get_stackid(ctx, &amp;amp;stack_map, BPF_F_KERNEL_STACK);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1895&quot; data-start=&quot;1841&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1858&quot; data-start=&quot;1841&quot;&gt;현재 CPU가 커널 모드라면&lt;/li&gt;
&lt;li data-end=&quot;1895&quot; data-start=&quot;1859&quot;&gt;syscall, scheduler, lock 경로 등이 잡힌다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1900&quot; data-start=&quot;1897&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1917&quot; data-start=&quot;1902&quot; data-ke-size=&quot;size23&quot;&gt;2. 유저 스택 수집&lt;/h3&gt;
&lt;p data-end=&quot;1934&quot; data-start=&quot;1919&quot; data-ke-size=&quot;size16&quot;&gt;유저 스택은 훨씬 까다롭다.&lt;/p&gt;
&lt;pre id=&quot;code_1766054813658&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bpf_get_stackid(ctx, &amp;amp;stack_map, BPF_F_USER_STACK);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2011&quot; data-start=&quot;1998&quot; data-ke-size=&quot;size16&quot;&gt;문제는 여기서 발생한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2080&quot; data-start=&quot;2013&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2031&quot; data-start=&quot;2013&quot;&gt;프레임 포인터가 없을 수 있음&lt;/li&gt;
&lt;li data-end=&quot;2062&quot; data-start=&quot;2032&quot;&gt;JIT 언어 (Go, Java)는 스택 구조가 다름&lt;/li&gt;
&lt;li data-end=&quot;2080&quot; data-start=&quot;2063&quot;&gt;심볼 해석은 커널에서 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2117&quot; data-start=&quot;2082&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent는 이 문제를 &lt;b&gt;역할 분리&lt;/b&gt;로 해결한다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2159&quot; data-start=&quot;2119&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2159&quot; data-start=&quot;2121&quot; data-ke-size=&quot;size16&quot;&gt;eBPF는 &amp;ldquo;주소만&amp;rdquo; 수집&lt;br /&gt;심볼 해석은 user space에서&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;2164&quot; data-start=&quot;2161&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2181&quot; data-start=&quot;2166&quot; data-ke-size=&quot;size26&quot;&gt;eBPF Map의 역할&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xSCE2/dJMcaihAY2g/pKXZ9ePKVo3gTmxs1iuI2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xSCE2/dJMcaihAY2g/pKXZ9ePKVo3gTmxs1iuI2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xSCE2/dJMcaihAY2g/pKXZ9ePKVo3gTmxs1iuI2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxSCE2%2FdJMcaihAY2g%2FpKXZ9ePKVo3gTmxs1iuI2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;469&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SpgNp/dJMcacIr5pv/gzF5ykRe12P7bLcZzlrufK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SpgNp/dJMcacIr5pv/gzF5ykRe12P7bLcZzlrufK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SpgNp/dJMcacIr5pv/gzF5ykRe12P7bLcZzlrufK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSpgNp%2FdJMcacIr5pv%2FgzF5ykRe12P7bLcZzlrufK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1249&quot; height=&quot;658&quot; data-origin-width=&quot;1249&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2253&quot; data-start=&quot;2225&quot; data-ke-size=&quot;size16&quot;&gt;eBPF 프로그램은 다음과 같은 map을 사용한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2324&quot; data-start=&quot;2255&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2272&quot; data-start=&quot;2255&quot;&gt;stack trace map&lt;/li&gt;
&lt;li data-end=&quot;2296&quot; data-start=&quot;2273&quot;&gt;count / histogram map&lt;/li&gt;
&lt;li data-end=&quot;2324&quot; data-start=&quot;2297&quot;&gt;temporary aggregation map&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2341&quot; data-start=&quot;2326&quot; data-ke-size=&quot;size16&quot;&gt;개념적 구조는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1766054885200&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;struct {
    __uint(type, BPF_MAP_TYPE_STACK_TRACE);
    __uint(max_entries, 16384);
} stack_map SEC(&quot;.maps&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2471&quot; data-start=&quot;2464&quot; data-ke-size=&quot;size16&quot;&gt;이 map은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2525&quot; data-start=&quot;2473&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2501&quot; data-start=&quot;2473&quot;&gt;동일한 call stack을 하나의 ID로 관리&lt;/li&gt;
&lt;li data-end=&quot;2512&quot; data-start=&quot;2502&quot;&gt;중복 저장 방지&lt;/li&gt;
&lt;li data-end=&quot;2525&quot; data-start=&quot;2513&quot;&gt;메모리 사용량 제한&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;2565&quot; data-start=&quot;2532&quot; data-ke-size=&quot;size26&quot;&gt;user space(parca-agent)에서 하는 일&lt;/h2&gt;
&lt;p data-end=&quot;2609&quot; data-start=&quot;2567&quot; data-ke-size=&quot;size16&quot;&gt;eBPF는 여기까지다.&lt;br /&gt;이제 baton은 user space로 넘어간다.&lt;/p&gt;
&lt;p data-end=&quot;2645&quot; data-start=&quot;2611&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent(user space)는 다음을 수행한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2745&quot; data-start=&quot;2647&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2661&quot; data-start=&quot;2647&quot;&gt;stack ID 수신&lt;/li&gt;
&lt;li data-end=&quot;2673&quot; data-start=&quot;2662&quot;&gt;주소 목록 조회&lt;/li&gt;
&lt;li data-end=&quot;2685&quot; data-start=&quot;2674&quot;&gt;심볼 정보 매핑&lt;/li&gt;
&lt;li data-end=&quot;2721&quot; data-start=&quot;2686&quot;&gt;label(node, pid, container 등) 부착&lt;/li&gt;
&lt;li data-end=&quot;2736&quot; data-start=&quot;2722&quot;&gt;protobuf 변환&lt;/li&gt;
&lt;li data-end=&quot;2745&quot; data-start=&quot;2737&quot;&gt;서버 전송&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2754&quot; data-start=&quot;2747&quot; data-ke-size=&quot;size16&quot;&gt;중요한 점은:&lt;/p&gt;
&lt;blockquote data-end=&quot;2781&quot; data-start=&quot;2756&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2781&quot; data-start=&quot;2758&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;agent는 &amp;ldquo;분석&amp;rdquo;을 하지 않는다&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2808&quot; data-start=&quot;2783&quot; data-ke-size=&quot;size16&quot;&gt;그저 &lt;b&gt;구조를 보존한 채 전달&lt;/b&gt;할 뿐이다.&lt;/p&gt;
&lt;hr data-end=&quot;2813&quot; data-start=&quot;2810&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2833&quot; data-start=&quot;2815&quot; data-ke-size=&quot;size26&quot;&gt;샘플링 기반이라는 것의 의미&lt;/h2&gt;
&lt;p data-end=&quot;2853&quot; data-start=&quot;2835&quot; data-ke-size=&quot;size16&quot;&gt;여기서 흔히 나오는 질문이 있다.&lt;/p&gt;
&lt;blockquote data-end=&quot;2879&quot; data-start=&quot;2855&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2879&quot; data-start=&quot;2857&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;샘플링이면 정확하지 않은 것 아닌가?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2891&quot; data-start=&quot;2881&quot; data-ke-size=&quot;size16&quot;&gt;답은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2934&quot; data-start=&quot;2893&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2908&quot; data-start=&quot;2893&quot;&gt;단일 샘플 &amp;rarr; 의미 없음&lt;/li&gt;
&lt;li data-end=&quot;2934&quot; data-start=&quot;2909&quot;&gt;수천, 수만 샘플 &amp;rarr; 통계적으로 매우 강력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2943&quot; data-start=&quot;2936&quot; data-ke-size=&quot;size16&quot;&gt;Parca는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2977&quot; data-start=&quot;2945&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2956&quot; data-start=&quot;2945&quot;&gt;순간의 정확성 ❌&lt;/li&gt;
&lt;li data-end=&quot;2977&quot; data-start=&quot;2957&quot;&gt;&lt;b&gt;시간 축의 누적 정확성 ⭕&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2986&quot; data-start=&quot;2979&quot; data-ke-size=&quot;size16&quot;&gt;을 선택했다.&lt;/p&gt;
&lt;hr data-end=&quot;2991&quot; data-start=&quot;2988&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3008&quot; data-start=&quot;2993&quot; data-ke-size=&quot;size26&quot;&gt;오버헤드는 왜 낮은가?&lt;/h2&gt;
&lt;p data-end=&quot;3042&quot; data-start=&quot;3010&quot; data-ke-size=&quot;size16&quot;&gt;parca-agent의 오버헤드가 낮은 이유는 구조적이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3108&quot; data-start=&quot;3044&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3062&quot; data-start=&quot;3044&quot;&gt;항상 같은 짧은 eBPF 코드&lt;/li&gt;
&lt;li data-end=&quot;3076&quot; data-start=&quot;3063&quot;&gt;조건 분기 거의 없음&lt;/li&gt;
&lt;li data-end=&quot;3083&quot; data-start=&quot;3077&quot;&gt;락 없음&lt;/li&gt;
&lt;li data-end=&quot;3096&quot; data-start=&quot;3084&quot;&gt;메모리 접근 제한적&lt;/li&gt;
&lt;li data-end=&quot;3108&quot; data-start=&quot;3097&quot;&gt;낮은 샘플링 빈도&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3123&quot; data-start=&quot;3110&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 운영 환경에서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3185&quot; data-start=&quot;3125&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3143&quot; data-start=&quot;3125&quot;&gt;CPU 오버헤드: 수 % 미만&lt;/li&gt;
&lt;li data-end=&quot;3166&quot; data-start=&quot;3144&quot;&gt;latency 영향: 측정 불가 수준&lt;/li&gt;
&lt;li data-end=&quot;3185&quot; data-start=&quot;3167&quot;&gt;장애 유발 가능성: 극히 낮음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3210&quot; data-start=&quot;3187&quot; data-ke-size=&quot;size16&quot;&gt;이 때문에 &lt;b&gt;상시 활성화&lt;/b&gt;가 가능하다.&lt;/p&gt;
&lt;hr data-end=&quot;3215&quot; data-start=&quot;3212&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3247&quot; data-start=&quot;3217&quot; data-ke-size=&quot;size26&quot;&gt;왜 tracing이 아니라 profiling인가?&lt;/h2&gt;
&lt;p data-end=&quot;3267&quot; data-start=&quot;3249&quot; data-ke-size=&quot;size16&quot;&gt;중요한 철학적 차이도 짚고 가자.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;구분TracingProfiling
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3403&quot; data-start=&quot;3269&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3403&quot; data-start=&quot;3312&quot;&gt;
&lt;tr data-end=&quot;3336&quot; data-start=&quot;3312&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3317&quot; data-start=&quot;3312&quot;&gt;접근&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3326&quot; data-start=&quot;3317&quot;&gt;이벤트 기반&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3336&quot; data-start=&quot;3326&quot;&gt;샘플링 기반&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3359&quot; data-start=&quot;3337&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3342&quot; data-start=&quot;3337&quot;&gt;비용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3353&quot; data-start=&quot;3342&quot;&gt;상대적으로 높음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3359&quot; data-start=&quot;3353&quot;&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3381&quot; data-start=&quot;3360&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3366&quot; data-start=&quot;3360&quot;&gt;정밀도&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3374&quot; data-start=&quot;3366&quot;&gt;매우 높음&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3381&quot; data-start=&quot;3374&quot;&gt;통계적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3403&quot; data-start=&quot;3382&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3388&quot; data-start=&quot;3382&quot;&gt;지속성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3394&quot; data-start=&quot;3388&quot;&gt;제한적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3403&quot; data-start=&quot;3394&quot;&gt;상시 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3438&quot; data-start=&quot;3405&quot; data-ke-size=&quot;size16&quot;&gt;Parca는 의도적으로 &lt;b&gt;profiling&lt;/b&gt;을 선택했다.&lt;/p&gt;
&lt;blockquote data-end=&quot;3462&quot; data-start=&quot;3440&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3462&quot; data-start=&quot;3442&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;항상 켜 두어야 의미가 있기 때문&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;3467&quot; data-start=&quot;3464&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3487&quot; data-start=&quot;3469&quot; data-ke-size=&quot;size26&quot;&gt;이 구조가 주는 실무적 의미&lt;/h2&gt;
&lt;p data-end=&quot;3517&quot; data-start=&quot;3489&quot; data-ke-size=&quot;size16&quot;&gt;이제 Parca가 왜 이런 구조를 가지는지 보인다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3575&quot; data-start=&quot;3519&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3530&quot; data-start=&quot;3519&quot;&gt;커널 안정성 유지&lt;/li&gt;
&lt;li data-end=&quot;3544&quot; data-start=&quot;3531&quot;&gt;운영 환경 적용 가능&lt;/li&gt;
&lt;li data-end=&quot;3560&quot; data-start=&quot;3545&quot;&gt;장애 시 blame 없음&lt;/li&gt;
&lt;li data-end=&quot;3575&quot; data-start=&quot;3561&quot;&gt;장시간 비교 분석 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3592&quot; data-start=&quot;3577&quot; data-ke-size=&quot;size16&quot;&gt;즉, parca-agent는&lt;/p&gt;
&lt;blockquote data-end=&quot;3637&quot; data-start=&quot;3594&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3637&quot; data-start=&quot;3596&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;ldquo;운영 서버에 깔아도&lt;br /&gt;죄책감이 들지 않는 eBPF 프로그램&amp;rdquo;&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3652&quot; data-start=&quot;3639&quot; data-ke-size=&quot;size16&quot;&gt;이라는 목표에 충실하다.&lt;/p&gt;
&lt;hr data-end=&quot;3657&quot; data-start=&quot;3654&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3669&quot; data-start=&quot;3659&quot; data-ke-size=&quot;size26&quot;&gt;다음 편 예고&lt;/h2&gt;
&lt;p data-end=&quot;3751&quot; data-start=&quot;3671&quot; data-ke-size=&quot;size16&quot;&gt;다음 편에서는&lt;br /&gt;이렇게 수집된 데이터가 &lt;b&gt;어떻게 Flamegraph로 변하는지&lt;/b&gt;,&lt;br /&gt;그리고 &lt;b&gt;사람이 어떻게 읽어야 하는지&lt;/b&gt;를 다룬다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3838&quot; data-start=&quot;3753&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3772&quot; data-start=&quot;3753&quot;&gt;Flamegraph의 진짜 의미&lt;/li&gt;
&lt;li data-end=&quot;3799&quot; data-start=&quot;3773&quot;&gt;Inclusive / Exclusive 비용&lt;/li&gt;
&lt;li data-end=&quot;3815&quot; data-start=&quot;3800&quot;&gt;흔히 저지르는 해석 실수&lt;/li&gt;
&lt;li data-end=&quot;3838&quot; data-start=&quot;3816&quot;&gt;&amp;ldquo;보이는 것&amp;rdquo;과 &amp;ldquo;중요한 것&amp;rdquo;의 차이&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3843&quot; data-start=&quot;3840&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3855&quot; data-start=&quot;3845&quot; data-ke-size=&quot;size23&quot;&gt;다음 편&lt;/h3&gt;
&lt;p data-end=&quot;3899&quot; data-start=&quot;3856&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4편. Flamegraph 제대로 읽기 &amp;ndash; Parca UI 해석 가이드&lt;/b&gt;&lt;/p&gt;</description>
      <category>Parca</category>
      <category>ebpf #bpf #parca</category>
      <author>SysBPF</author>
      <guid isPermaLink="true">https://overfrost.tistory.com/3</guid>
      <comments>https://overfrost.tistory.com/3#entry3comment</comments>
      <pubDate>Thu, 18 Dec 2025 19:49:48 +0900</pubDate>
    </item>
  </channel>
</rss>