vlambda博客
学习文章列表

Linux 系统空间 sys 真的猛如虎吗?






背景

初入行时,当我看到 cpu 的 sys 占用比较高会慌的一批;岁月渐长,伴随知识和经历的积累,我渐渐的看开了,主要是这个东西逃不掉的,哪怕是最简单的 hello world 都要好多个系统调用才能完成。


先上结论吧、hello world 程序在各个不同的语言平台下,系统调用次数如下表:


程序 语言 系统调用次数
打印 hello world C++ 57
打印 hello world nodejs 511
打印 hello world Python3 711


不算是哪个程序都会涉及到系统调用,之所以给出这个结论是因为 进程控制内存管理进程间通信文件操作 这些基础操作都进入内核模式才能执行。总的来讲是逃不掉的,但是个别情况也能从中发现一些性能问题。




C++ 版本的 hello-world 需要几个系统调用


别的不说了,直接上经典代码。


#include<iostream>using namespace std;
int main() { cout<<"hello world"<<endl; return 0;}




编译并执行并观察其有多少个系统调用

g++ -o hello-sys hello-sys.cppstrace -o hello-sys.log ./hello-sys


现在看一下日志文件 hello-sys.log 文件中记录的系统调用次数。

cat hello-sys.log | wc -l57


可以看到在我的系统环境下一个用 C++ 写的 hello-wrold 需要 57 次系统调用才能完成,为了节约字数,下面只看一下开头和结尾有哪些系统调用。

execve("./hello-sys", ["./hello-sys"], 0x7ffe8f7ea840 /* 24 vars */) = 0...省略中间的系统调用...
write(1, "hello world\n", 12) = 12exit_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 -l511





Python 版本的 hello-world 需要几个系统调用


直接上代码

print("hello world")


执行 python 版本的 hello world,观察其系统调用数量

strace -o python-sys.log python3 main.pycat python-sys.log | wc -l711