Linux 系统空间 sys 真的猛如虎吗?
背景
初入行时,当我看到 cpu 的 sys 占用比较高会慌的一批;岁月渐长,伴随知识和经历的积累,我渐渐的看开了,主要是这个东西逃不掉的,哪怕是最简单的 hello world 都要好多个系统调用才能完成。
先上结论吧、hello world 程序在各个不同的语言平台下,系统调用次数如下表:
程序 | 语言 | 系统调用次数 |
打印 hello world | C++ | 57 |
打印 hello world | nodejs | 511 |
打印 hello world | Python3 | 711 |
不算是哪个程序都会涉及到系统调用,之所以给出这个结论是因为 进程控制、内存管理、进程间通信、文件操作 这些基础操作都进入内核模式才能执行。总的来讲是逃不掉的,但是个别情况也能从中发现一些性能问题。
C++ 版本的 hello-world 需要几个系统调用
别的不说了,直接上经典代码。
using namespace std;
int main() {
cout<<"hello world"<<endl;
return 0;
}
编译并执行并观察其有多少个系统调用
g++ -o hello-sys hello-sys.cpp
strace -o hello-sys.log ./hello-sys
现在看一下日志文件 hello-sys.log 文件中记录的系统调用次数。
cat hello-sys.log | wc -l
57
可以看到在我的系统环境下一个用 C++ 写的 hello-wrold 需要 57 次系统调用才能完成,为了节约字数,下面只看一下开头和结尾有哪些系统调用。
execve("./hello-sys", ["./hello-sys"], 0x7ffe8f7ea840 /* 24 vars */) = 0
...
省略中间的系统调用
...
write(1, "hello world\n", 12) = 12
exit_group(0) = ?
execve : 告诉内核要执行哪个程序
write: cout 底层调用的这个用于向 stdout 写
exit_group 退出
nodejs 版本的 hello-world 需要几个系统调用
直接上代码
console.log("hello world")
执行 node 版本的 hello world,观察其系统调用的数量。
strace -o node-sys.log node hello-node-env.js
hello world
cat node-sys.log | wc -l
511
Python 版本的 hello-world 需要几个系统调用
直接上代码
print("hello world")
执行 python 版本的 hello world,观察其系统调用数量
strace -o python-sys.log python3 main.py
cat python-sys.log | wc -l
711