명령 플래그는 --vm
다음과 같습니다 stress
.
-m, --vm N 생성 malloc()/free()에서 회전하는 N 작업자 스레드 생성
실제로 무엇을 하는지 보고 싶어서 다음 명령을 실행했습니다.
strace stress --vm 1
나는 다음과 같은 결과를 얻습니다.
execve("/bin/stress", ["stress", "--vm", "1"], [/* 27 vars */]) = 0
brk(NULL) = 0x55f05bef2000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fce9f15a000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=40388, ...}) = 0
mmap(NULL, 40388, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fce9f150000
close(3) = 0
open("/lib64/libm.so.6", 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\0pS\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1139680, ...}) = 0
mmap(NULL, 3150136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fce9ec38000
mprotect(0x7fce9ed39000, 2093056, PROT_NONE) = 0
mmap(0x7fce9ef38000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x100000) = 0x7fce9ef38000
close(3) = 0
open("/lib64/libc.so.6", 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\0P%\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2173512, ...}) = 0
mmap(NULL, 3981792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fce9e86b000
mprotect(0x7fce9ea2e000, 2093056, PROT_NONE) = 0
mmap(0x7fce9ec2d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c2000) = 0x7fce9ec2d000
mmap(0x7fce9ec33000, 16864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fce9ec33000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fce9f14f000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fce9f14d000
arch_prctl(ARCH_SET_FS, 0x7fce9f14d740) = 0
mprotect(0x7fce9ec2d000, 16384, PROT_READ) = 0
mprotect(0x7fce9ef38000, 4096, PROT_READ) = 0
mprotect(0x55f05abdb000, 4096, PROT_READ) = 0
mprotect(0x7fce9f15b000, 4096, PROT_READ) = 0
munmap(0x7fce9f150000, 40388) = 0
getpid() = 5305
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fce9f159000
write(1, "stress: info: [5305] dispatching"..., 64stress: info: [5305] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
) = 64
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fce9f14da10) = 5306
wait4(-1
출력이 여기에 멈춰 있고 malloc()
통화가 표시되지 않습니다. 생성 malloc()
및 free()
시스템 호출을 어떻게 볼 수 있나요 ?
답변1
malloc
free
시스템 호출이 아닌 라이브러리 호출 입니다 . 이것이 매뉴얼 섹션 3에 나타나는 이유입니다.
그러나 스트레스는 malloc과 free를 사용하지 않고, mmap
과 를 통해 커널 할당자를 호출합니다 munmap
.
스트레스는 하위 프로세스에서 이 작업을 수행하므로 이러한 호출을 표시하려면 strace에 -f를 지정해야 합니다.
strace -f stress --vm 1