안녕하세요 이웃님들 ^.^
좋은 아침 입니다.
오늘 포스팅은 리눅스 성능 감시 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이지요
그럼 많은 도움이 되었기를 바랍니다.
오늘도 좋은 하루 되세요.
'리눅스 일반' 카테고리의 다른 글
[리눅스] lsof 사용 방법 (87) | 2024.03.30 |
---|---|
[리눅스] 성능 툴 opensnoop 사용 방법 (106) | 2024.03.29 |
[리눅스] 성능 툴 ltrace 사용 방법 (87) | 2024.03.23 |
[리눅스] 성능 감시 Tool - ss 사용 (72) | 2023.04.16 |
[Linux] Ubuntu에 Wireshark 설치 하기 (35) | 2023.01.09 |