--vm
指挥旗stress
说,
-m, --vm N spawn N 个在 malloc()/free() 上旋转的工人
我想看看它实际上在做什么,所以我运行了这个命令,
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()
调用?
malloc
并且free
是库调用而不是系统调用。这就是为什么它们出现在手册的第 3 节中然而压力不使用 malloc 和 free,而是通过
mmap
and调用内核分配器munmap
。因为压力在子进程中执行此操作,您需要指定 -f 来 strace 以使这些调用可见。