如何避免编译代码造成的电脑卡顿

编译大项目(特别是c++项目)时,经常会造成个人电脑卡顿甚至崩溃。而如果是在公共服务器上的话甚至会导致抢占资源。所以需要用一些方法来限制编译的程序。

提示

如果程序理论上需要消耗的内存大小大于你的电脑所能提供的内存,那程序也只有消耗交换空间和直接崩溃两条路可走。所以电脑不行的话还是换电脑吧,或者放到服务器上运行。

nice

nice 是一个 Linux 自带的指令,用于调整程序优先级。在程序面前加上nice可以在默认的优先级上进行再调整。调整范围为 -20 (最高优先级)到 19 (最低优先级)。数值越高

这里抄一段菜鸟教程上面的实例1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# vi & //后台运行
[1] 15297
# nice vi & //设置默认优先级
[2] 15298

[1]+ Stopped vi
# nice -n 19 vi & //设置优先级为19
[3] 15299

[2]+ Stopped nice vi
# nice -n -20 vi & //设置优先级为 -20
[4] 15300

[3]+ Stopped nice -n 19 vi
# ps -l //显示进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 15278 15212 0 80 0 - 1208 wait pts/2 00:00:00 bash
0 T 0 15297 15278 0 80 0 - 2687 signal pts/2 00:00:00 vi // 默认优先级
0 T 0 15298 15278 0 90 10 - 2687 signal pts/2 00:00:00 vi // 优先级+10 (降低优先级)
0 T 0 15299 15278 1 99 19 - 2687 signal pts/2 00:00:00 vi // 优先级+19 (降低优先级)
4 T 0 15300 15278 3 60 -20 - 2687 signal pts/2 00:00:00 vi // 优先级-20 (提高优先级)
4 R 0 15301 15278 0 80 0 - 625 - pts/2 00:00:00 ps

[4]+ Stopped nice -n -20 vi

taskset / sched_setaffinity

taskset 指令可以指定程序运行在哪个cpu上。cpu编号从0开始
如以下指令

1
taskset -c 4-7 ./test.sh&

将 ./test.sh 这个任务绑定在第5到第8个cpu上运行。其底层是使用了sched_setaffinity() 系统调用,参考sched_setaffinity(2) - Linux man page。子进程如果继承了环境变量的话,那么绑定cpu的操作也会自动继承到子进程上。

cgroups

cgroups 机制对系统底层资源进行了物理隔离,是 linux 内核资源虚拟化的基础。用 cgroups 对程序隔离的方式比较灵活。这里不展开了,参考这篇文章:lecury-浅谈Linux Cgroups机制

c++编译加速的几个方式

distcc

distcc 是一个将 C、C++、Objective C 或 Objective C++ 等程序的编译任务分发到网络中多个主机的程序。distcc 力求实现和本地编译相同的结果,安装、使用都很方便,而且通常比本地编译快很多 2

ccache

由于C/C++编译时需要大量重复展开头文件,造成了编译慢的情况。ccache将头文件构建了高速缓存,可以加快编译速度。并且 ccache 适配了 gcc 和 clang, archlinux 中的 makepkg 指令也支持使用 ccache。3

参考资料

1:Linux nice命令 - 菜鸟教程
2:distcc - archlinux wiki
3:ccache - archlinux wiki