岛屿可以找到海
岛屿可以找到海

记录一次服务器go程序无故终止

这天突然又收到了uptime kuma的通知,我就知道自己的项目又挂了,这个项目已经挂了很多次了,日志也没有记录到异常,我给所有goroutines都添加了recover(),去捕获异常,但是就是没有日志,那么我一想估计就是被系统kill了。

这个项目做了负载均衡,一台再1h2g的服务器上,另外一个在2h4g的服务器上,2h4g的服务器上项目从没挂过,1h2g的服务器跑的项目也有点多普遍内存占用都在60%以上,那就很有可能是oom killer。

服务器查询了一下oom的日志

dmesg -T | grep -i kill

https://cdn.dykyzdh.cn/wp-content/uploads/2025/05/image-scaled.png

确实是被kill了,实际物理内存占用510mb,小水管内存还是有点小啊。

解决方案,调整golang gc的阈值

debug.SetMemoryLimit(400 * 1024 * 1024)

设置了项目最大内存400mb,到这个阈值了就gc回收一下,这样虽然gc频繁了,但是不至于老被kill,先这样吧,观察一段时间看看这个方法可行不。

岛屿可以找到海

记录一次服务器go程序无故终止
这天突然又收到了uptime kuma的通知,我就知道自己的项目又挂了,这个项目已经挂了很多次了,日志也没有记录到异常,我给所有goroutines都添加了recover(),去捕获异常,但是就是没有日志…
扫描二维码继续阅读
2025-05-20