centos swap 内存不被使用问题

2021-07-10 00:45:13 +08:00
 csfreshman

自己有台淘汰的笔记本,内存较小,安装了 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,可以从哪些方面去分析呢?

1496 次点击
所在节点    CentOS
13 条回复
yujiang
2021-07-10 02:00:16 +08:00
reboot 了没?
billlee
2021-07-10 02:10:12 +08:00
建议贴一下 /proc/meminfo
vk42
2021-07-10 03:55:26 +08:00
建议直接加内存,大量换页的情况下能卡得让你怀疑人生,而且还没法操作去 kill 进程……
所以现在很多情况基本不配 swap,或者 swap 配合 OOM killer 一起上,至少不会系统卡死半天
csfreshman
2021-07-10 08:01:32 +08:00
@yujiang reboot 了,swap 开机自动挂上,还是不行。
csfreshman
2021-07-10 08:03:05 +08:00
```
[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
csfreshman
2021-07-10 08:04:36 +08:00
@vk42 笔记本,加物理内存比较麻烦,而且这个机器想着尽可能利用起来旧机器。
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 看看资源占用
love
2021-07-10 09:16:11 +08:00
linux 内核原生支持 swap 内存压缩,可以加上试试可以省点 ssd 写入量
csfreshman
2021-07-10 09:58:40 +08:00
@vk42 swap 拖后腿慢我可以理解,毕竟磁盘性能和内存不在一个数量级,但是 swap 的占用一直不变 0,这两个值都改了重启(改了永久生效,编译前确保值是对的)(没重启试了 sysctl -p)都不行。
csfreshman
2021-07-10 10:22:25 +08:00
@love 现在问题是 swap 没用,一点写入量都没有,😁
billlee
2021-07-10 13:18:41 +08:00
@csfreshman 你这个 meminfo 是空载时的状况吧。。
csfreshman
2021-07-10 17:35:58 +08:00
@billlee 恩,卡死的那个状态看到,完全没响应了,除非 ctrl c 掉那个 grpc 的编译
csfreshman
2021-07-11 11:09:59 +08:00
加了 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
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788640

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX