我的一个守护进程一旦开始接收请求,就会立即被终止。即使我尝试在前台运行它,应用程序日志也没有任何错误输出。
我怀疑操作系统可能会因为 OOM 而杀死它,因为这个 VM 实例只分配了 512 MB。
我想找出导致这种情况的原因,但由于可用的日志文件很少,我感到很困惑:
# ls -la /var/log
total 20011
drwxr-xr-x 3 root sys 10 Oct 9 02:38 .
drwxr-xr-x 31 root root 31 May 15 2013 ..
-rw-r----- 1 root root 4914932 Nov 15 16:34 auth.log
-rw-r--r-- 1 root root 0 Sep 9 15:49 courier.log
drwxr-xr-x 3 root root 5 Nov 8 22:18 httpd
-rw-r--r-- 1 root root 2515768 Sep 10 03:10 postfix.log
-rw-r----- 1 root other 0 Feb 21 2008 sysidconfig.log
-rw-r----- 1 root sys 2514934 Sep 10 03:10 syslog
-rw------- 1 root root 132 Nov 8 18:45 vsftpd.log
-rw-r--r-- 1 root root 0 Jun 5 2012 zoneinit.log
如您所见,syslog 已有两个月历史,最近没有添加新条目。这就是我能找到的所有日志文件。
我在 SmartOS 上运行:
SunOS hostname 5.11 joyent_20120504T040233Z i86pc i386 i86pc
我有此实例的根权限(据我所知,在 SmartOS 术语中称为“区域”),但无法控制整个系统。
我读了我如何知道 Linux 服务器是否杀死了我的进程以及它杀死了哪个进程?,但对我的情况没有帮助。
答案1
Solaris/SmartOS 没有实现 OOM Killer。所以不是那样。如果应用程序试图请求不可用的内存,则会向应用程序返回错误,并允许其继续运行。当然,应用程序如何管理错误是另一个问题。
您可以使用 truss/dtrace 检查应用程序正在进行的系统调用并查找返回的任何错误。
您还可以使用 prstat、ps 等监视该进程,以查看它请求/使用了多少内存。