自己有台淘汰的笔记本,内存较小,安装了 centos 系统,在安装 grpc 的时候报错 oom,使用命令:
watch -n 2 free -m
查看发现内存耗尽了,于是参考文档配置了 swap 内存,未编译时状态:
[root ~]#free -m
total used free shared buff/cache available
Mem: 3685 426 2922 9 335 3022
Swap: 11967 0 11967
编译 grpc 后的状态
Every 2.0s: free -m Fri Jul 9 12:40:49 2021
total used free shared buff/cache available
Mem: 3685 3361 98 9 225 87
Swap: 11967 0 11967
从上面的图可以看到,内存基本上使用完了,但死活不使用 swap 里的内存,最后程序卡死,编译 grpc 一直卡在 50%,我把 vm.swappiness 值设置为 10 20 …… 100 最后结果一样。
grpc 最终卡在:
[ 49%] Building CXX object third_party/protobuf/CMakeFiles/libprotoc.dir/__/src/google/protobuf/compiler/plugin.cc.o
[ 49%] Building CXX object third_party/protobuf/CMakeFiles/libprotoc.dir/__/src/google/protobuf/compiler/plugin.pb.cc.o
[ 49%] Building CXX object third_party/protobuf/CMakeFiles/libprotoc.dir/__/src/google/protobuf/compiler/python/python_generator.cc.o
[ 50%] Built target bssl
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^Cmake[2]: *** [third_party/protobuf/CMakeFiles/libprotoc.dir/__/src/google/protobuf/compiler/code_generator.cc.o] 中断
make[2]: *** [third_party/abseil-cpp/absl/flags/CMakeFiles/absl_flags.dir/flag.cc.o] 中断
make[2]: *** [third_party/abseil-cpp/absl/status/CMakeFiles/absl_statusor.dir/statusor.cc.o] 中断
make[1]: *** [third_party/protobuf/CMakeFiles/libprotoc.dir/all] 中断
make: *** [all] 中断
^C
ctrl + c 后 swap 里反而有了使用内存:
Every 2.0s: free -m Fri Jul 9 12:44:15 2021
total used free shared buff/cache available
Mem: 3685 166 3450 1 68 3358
Swap: 11967 262 11705
gcc 和系统版本:
[root ~]#gcc --version
gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)
[root ~]#uname -a
Linux MiWiFi-RA50-srv 3.10.0-1160.31.1.el7.x86_64 #1 SMP Thu Jun 10 13:32:12 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
跪求各位大佬帮忙分析下,如何才能让 swap 生效,从而可以完成编译 grpc,可以从哪些方面去分析呢?
1
yujiang 2021-07-10 02:00:16 +08:00 via Android
reboot 了没?
|
2
billlee 2021-07-10 02:10:12 +08:00
建议贴一下 /proc/meminfo
|
3
vk42 2021-07-10 03:55:26 +08:00
建议直接加内存,大量换页的情况下能卡得让你怀疑人生,而且还没法操作去 kill 进程……
所以现在很多情况基本不配 swap,或者 swap 配合 OOM killer 一起上,至少不会系统卡死半天 |
4
csfreshman OP @yujiang reboot 了,swap 开机自动挂上,还是不行。
|
5
csfreshman OP ```
[root ~]#cat /proc/meminfo MemTotal: 3773708 kB MemFree: 2986772 kB MemAvailable: 3085032 kB Buffers: 2360 kB Cached: 298604 kB SwapCached: 0 kB Active: 369276 kB Inactive: 212888 kB Active(anon): 281780 kB Inactive(anon): 8968 kB Active(file): 87496 kB Inactive(file): 203920 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 12255224 kB SwapFree: 12255224 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 281228 kB Mapped: 47088 kB Shmem: 9548 kB Slab: 81752 kB SReclaimable: 38480 kB SUnreclaim: 43272 kB KernelStack: 3904 kB PageTables: 12344 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 14142076 kB Committed_AS: 1444544 kB VmallocTotal: 34359738367 kB VmallocUsed: 545636 kB VmallocChunk: 34358423548 kB Percpu: 2592 kB HardwareCorrupted: 0 kB AnonHugePages: 180224 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 103168 kB DirectMap2M: 3985408 kB ``` swap 看 total 和 free 一样 12255224kB |
6
csfreshman OP @vk42 笔记本,加物理内存比较麻烦,而且这个机器想着尽可能利用起来旧机器。
|
7
vk42 2021-07-10 08:22:27 +08:00
@csfreshman 实在不想加内存可以试试下面的方法:
- /proc/sys/vm/overcommit_memory,这个应该是要设置成 1 才能正常超额分配虚拟内存 - /proc/sys/vm/oom_kill_allocating_task,这个设置应该是 0 另外如果编译卡住可能就是 swap 拖后腿了,可以用 atop 看看资源占用 |
8
love 2021-07-10 09:16:11 +08:00
linux 内核原生支持 swap 内存压缩,可以加上试试可以省点 ssd 写入量
|
9
csfreshman OP @vk42 swap 拖后腿慢我可以理解,毕竟磁盘性能和内存不在一个数量级,但是 swap 的占用一直不变 0,这两个值都改了重启(改了永久生效,编译前确保值是对的)(没重启试了 sysctl -p)都不行。
|
10
csfreshman OP @love 现在问题是 swap 没用,一点写入量都没有,😁
|
11
billlee 2021-07-10 13:18:41 +08:00
@csfreshman 你这个 meminfo 是空载时的状况吧。。
|
12
csfreshman OP @billlee 恩,卡死的那个状态看到,完全没响应了,除非 ctrl c 掉那个 grpc 的编译
|
13
csfreshman OP 加了 8g 的 swap,今天出门前编译 grpc,过一个小时回来看到 swap 有在使用,还在编译,好慢,想旧物利用这么难
``` Every 5.0s: free -m Sat Jul 10 23:07:21 2021 total used free shared buff/cache available Mem: 3830 3597 112 8 121 43 Swap: 11967 4624 7343 ``` |