【发布时间】:2014-04-22 09:15:53
【问题描述】:
我创建了一个后台线程B,在B的func中,
void func()
{
system('gzip -f text-file'); // size of text-file is 100M
xxx
}
我发现某个cpu(我的服务器有多个cpu核心)的sys是100%。 strace进度,我发现clone syscall消耗超过3秒,这几乎是gzip的执行时间。
**17:46:04.545159** clone(child_stack=0, flags=CLONE_PARENT_SETTID|SIGCHLD, parent_tidptr=0x418dba38) = 39169
**17:46:07.432385** wait4(39169, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 39169
所以我的问题是, 1. system('gzip -f text-file') 是否导致100% cpu sys? 2. 根本原因是什么
【问题讨论】:
-
可能是因为clone会复制父进程的内存结构。 sys_clone -> do_fork -> copy_process -> dup_mm -> dup_mmap。在我的实验中,parent 的 rss 是 60G,大约 2000 个 mmap 条目。
-
上面的猜测是对的。 copy_page_range消耗大部分时间,当进程的rss较大时,执行时间线性增加。
标签: linux-kernel system cpu-usage system-calls