산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial Internet of Things >> 사물 인터넷 기술

Perf로 분산 애플리케이션 프로파일링

많은 개발자와 마찬가지로 저 역시 기존 애플리케이션을 가져와서 기본적으로 느린 코드를 제거하고 빠른 코드로 교체하여 더 빠르게 만들어야 하는 상황에 처했습니다. 이제 코드를 최적화할 때 다음과 같은 간단한 규칙을 따라야 한다는 것을 압니다.

응용 프로그램의 속도를 늦추는 코드가 무엇이든 가장 마지막에 살펴봐야 하는 코드입니다.

프로파일링은 직관의 한계를 매우 빠르게 받아들이게 하는 거래입니다. 코드에서 최적화가 필요한 부분을 알려주기 위해 차갑고 엄격한 측정이 필요하다는 것을 일찍 깨달았습니다. 다행히 코드 실행 방식과 관련된 거의 모든 것을 측정할 수 있는 프로파일링 도구가 많이 있습니다.

그러나 도구가 반드시 프로파일링을 쉽게 만드는 것은 아닙니다. 측정값을 해석하는 것은 까다로울 수 있으며 실험을 수행할 때 변수를 엄격하게 제어해야 합니다. 특히 다중 스레드 및 분산 응용 프로그램은 프로파일링하기 어렵습니다.

경쟁 조건을 디버그해야 했던 사람이라면 누구나 다중 스레드 응용 프로그램의 동작이 얼마나 시간에 민감한지 잘 알 것입니다. 다중 스레드 응용 프로그램을 프로파일링하는 경우 타이밍이 측정에서 중요한 요소가 되기 때문에 유사한 문제가 있습니다.

callgrind와 같은 프로파일러는 프로그램 속도를 크게 낮추므로 타이밍에 영향을 줍니다. 이러한 프로파일러의 한계를 보여주는 예는 뮤텍스 경합입니다. 뮤텍스가 많이 사용되어 코드가 잠금 기능에 많은 시간을 할애하기 때문에 애플리케이션이 느리게 실행될 수 있습니다. callgrind와 같은 도구는 지침을 계산하므로 이를 표시하지 않습니다. , 시간이 아닙니다.

"통계 프로파일링"을 수행하는 프로파일러의 또 다른 클래스가 있습니다. 이 프로파일러를 사용하면 평소처럼 프로그램을 실행하면서 애플리케이션이 시간을 보내는 위치에 대한 주기적 스냅샷을 찍을 수 있습니다. 이러한 프로파일러는 정확한 결과를 생성하기 위해 얼마 동안 실행해야 하지만 타이밍에 미치는 영향을 최소화하면서 실행할 수 있습니다. 따라서 다중 스레드 및/또는 분산 응용 프로그램을 프로파일링하는 데 적합합니다!

Linux perf 도구를 사용하여 프로파일링 워크플로를 공유하고 싶었습니다. 이 도구는 성능 "핫스팟"을 빠르게 식별할 수 있어 특히 유용합니다. RTI Connext 5.3.0의 c/hello_dynamic 예제를 성능 측정 대상으로 사용하겠습니다.

먼저 Linux 시스템에 perf가 설치되어 있는지 확인합니다. Ubuntu에서 내 컴퓨터에 perf를 설치하려면 다음 명령을 실행해야 했습니다.

sudo apt-get install linux-tools-common linux-tools-3.13.0-107-generic

다음으로, perf의 출력을 수집된 프로파일링 데이터의 시각적 표현인 "FlameGraph"로 변환할 수 있는 GitHub 프로젝트를 다운로드해야 합니다. 액세스하기 편리한 위치(예:홈 디렉토리)에서 이 명령을 실행하십시오.

git clone https://github.com/brendangregg/FlameGraph

이제 rti_workspace/examples/c 폴더의 hello_dynamic 예제로 이동합니다. 다음 명령을 사용하여 코드를 빌드합니다(NDDSHOME이 RTI Connext 설치로 설정되어 있는지 확인).

<사전>내보내기 디버그=1
make -f makefile_Hello_x64Linux3gcc4.8.2

makefile 이름의 플랫폼은 플랫폼과 다를 수 있습니다. DEBUG 환경 변수를 설정하는 방법에 유의하십시오. 바이너리가 디버깅 기호를 갖도록 이 작업을 수행하여 출력을 수행하는 호출 스택의 함수 이름을 볼 수 있습니다.

이제 코드에서 perf를 실행할 수 있습니다. 다음 명령을 실행하십시오.

objs/x64Linux3gcc4.8.2/Hello sub &
sudo 성능 기록 -g objs/x64Linux3gcc4.8.2/Hello pub

잠시 후 control-C를 눌러 게시자를 종료합니다. Perf는 "perf.out"이라는 파일을 생성합니다. 이제 FlameGraph 저장소의 스크립트를 사용하여 이 파일을 FlameGraph 도구가 이해할 수 있는 것으로 변환해야 합니다.

<사전>perf 스크립트 -f | ~/FlameGraph/stackcollapse-perf.pl> out.perf 접힌

여기에서 FlameGraph 이미지를 생성할 수 있습니다.

~/FlameGraph/flamegraph.pl out.perf-folded> perf.svg

웹 브라우저에서 perf.svg 파일을 열면 다음과 같아야 합니다.


가로 축은 특정 함수에 소요된 시간을 나타내는 반면 누적 막대는 응용 프로그램의 호출 스택을 나타냅니다. 각 막대를 클릭하여 특정 스택을 확대할 수 있습니다.

구독자 없이 게시자를 다시 실행해 보십시오. 가입자가 없을 때 DDS가 데이터를 보내지 않기 때문에 Flamegraph의 오른쪽 부분이 사라지는 것을 알 수 있습니다!

perf 도구는 이 블로그에서 설명하는 것보다 훨씬 더 많은 작업을 수행할 수 있습니다. 프로파일링 작업을 더 쉽게 만들어주는 다른 설정이나 도구를 알고 계시다면 저희에게 알려주십시오!

즐거운 프로파일링!


사물 인터넷 기술

  1. 몰리브덴이 다른 요소와 결합합니까?
  2. Ethereum 및 Google을 사용하여 하이브리드 블록체인/클라우드 애플리케이션 구축
  3. React Native 및 AWS로 서버리스 모바일 애플리케이션 구축
  4. 간단한 근접 센서 회로 및 애플리케이션 작업
  5. 애플리케이션이 있는 아날로그 및 디지털 센서 유형
  6. Microchip:COTS-to-radiation-to-lerant 코어 MCU를 사용한 확장 공간 애플리케이션
  7. 간단하게 IT 병목 현상 제거:로우 코드 플랫폼이 핵심을 차지합니다.
  8. Ovo는 VCharge 스마트 그리드 구매로 분산 에너지 게임을 강화합니다
  9. CNC 목재 라우터 - 놀라운 애플리케이션 사용
  10. 의학에서 AI의 5가지 실제 적용(예제 포함)