리눅스 일반

[리눅스] 성능 분석 툴 Strace 사용 방법

트리스탄1234 2024. 3. 21. 05:43
728x90
반응형

 
안녕하세요 이웃님들 ^.^
좋은 아침 입니다. 
 
오늘 포스팅은 리눅스 성능 감시 Tool들 중 Strace에 대해서 포스팅을 해보겠습니다. 
 
strace 명령어는 리눅스에서 프로세스가 시스템 호출(system call)을 어떻게 사용하는지를 추적하고 
분석하는 유틸리티입니다. 이를 통해 프로그램이 시스템 리소스에 접근하고 행동하는 방식을 이해할 수 있습니다.

strace를 사용하는 기본적인 형식은 아래와 같습니다. 
 
사용 형식
strace [옵션] [프로그램] [인자]
 
사용 하는 방법을 예를 들면 , /bin/ls 프로그램을 실행하고 그 동안 발생하는 시스템 호출을 추적하려면
다음과 같이 입력합니다:

strace /bin/ls
strace는 프로그램이 종료될 때까지 프로그램이 호출하는 모든 시스템 호출을 보여줍니다.
 
그럼 에를 들어서 github명령어 중 git add .을 strace를 사용하여 시그널을 추적을 해보면. 
아래와 같습니다. 

ubuntu@DESKTOP-H5OIPJC:~$ strace git add .
execve("/usr/bin/git", ["git", "add", "."], 0x7fff8f8ffac0 /* 25 vars */) = 0
brk(NULL)                               = 0x560ad386a000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffd43121d90) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=37483, ...}) = 0
mmap(NULL, 37483, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa42bf33000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libpcre2-8.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\"\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=588488, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa42bf31000
mmap(NULL, 590632, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa42bea0000
mmap(0x7fa42bea2000, 413696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fa42bea2000
mmap(0x7fa42bf07000, 163840, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x67000) = 0x7fa42bf07000
mmap(0x7fa42bf2f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x8e000) = 0x7fa42bf2f000
close(3)                                = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libz.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\"\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=108936, ...}) = 0
mmap(NULL, 110776, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa42be84000
mprotect(0x7fa42be86000, 98304, PROT_NONE) = 0
mmap(0x7fa42be86000, 69632, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fa42be86000
mmap(0x7fa42be97000, 24576, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13000) = 0x7fa42be97000
mmap(0x7fa42be9e000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x19000) = 0x7fa42be9e000
close(3)                                = 0

 

반응형


이런 식으로 실행되는 프로그램의 시그널을 추적해서 어디서 문제가 발생을 하는지 확인을 할수가 있습니다. 
그럼 Strace에서 사용 가능한 옵션들을 살펴 봅시다. 

-o <파일>: 출력을 파일로 리다이렉션합니다.
-p <프로세스 ID>: 실행 중인 프로세스의 시스템 호출을 추적합니다.
-e <시스템 호출>: 특정한 시스템 호출만 추적합니다.
-f: 자식 프로세스의 시스템 호출도 추적합니다.
-t: 시간 정보를 출력합니다.

예를 들어, 시스템 호출 중 open 호출만 추적하고 결과를 파일에 저장하려면 다음과 같이 입력합니다:

strace -e open -o output.txt /bin/ls
이는 ls 명령어 실행 중에 open 시스템 호출을 추적하고, 결과를 output.txt 파일에 저장합니다.

ubuntu@DESKTOP-H5OIPJC:~$ strace -e open -o output.txt /bin/ls
1  bin  eshop-legacy-mentee  eshop-legacy-mentee.tar.gz  minikube-linux-amd64  output.txt  t3-msp-pjt
ubuntu@DESKTOP-H5OIPJC:~$

ubuntu@DESKTOP-H5OIPJC:~$ ls -al | grep output.txt
-rw-r--r--  1 ubuntu ubuntu       22 Mar 20 21:13 output.txt
ubuntu@DESKTOP-H5OIPJC:~$
ubuntu@DESKTOP-H5OIPJC:~$ cat output.txt
+++ exited with 0 +++


시그널 종류를 간단히 살펴 보면 아래와 같은 시그널들이 있습니다. 
 - open(), close(): 파일을 열거나 닫습니다.
 - read(), write(): 파일에서 읽거나 파일에 쓰기를 수행합니다.
 - mkdir(), rmdir(), unlink(): 디렉터리를 생성하거나 삭제합니다.
 - pipe(), shmget(), msgget(): 프로세스 간 통신을 위한 파이프, 공유 메모리, 메시지 큐 등을 생성합니다.
 - kill(), signal(): 시그널을 보내거나 시그널 핸들러를 등록합니다.
 - stat(), fstat(), lstat(): 파일의 상태를 가져옵니다.
 - chown(), chmod(): 파일의 소유자나 권한을 변경합니다
  - socket(), connect(), bind(), listen(): 네트워크 소켓을 생성하고 관련된 동작을 수행합니다.
  - send(), recv(): 데이터를 송신하고 수신합니다.
  - malloc(), free(): 동적 메모리 할당과 해제를 수행합니다.
  - mmap(), munmap(): 파일을 메모리에 매핑하거나 메모리를 언매핑합니다.

간단하지만 매우 Application을 디버깅할때 매우 유용한 Tool이지요
그럼 많은 도움이 되었기를 바랍니다.
 
오늘도 좋은 하루 되세요.

 

https://blog.naver.com/ppp0183
 

728x90
반응형