sudo:无法创build套接字:无法分配内存

在由OVH运行的VPS(显然是基于OpenVZ的,给出/proc/user_beancounters存在),相对较less的进程运行,试图sudo给我在标题中的错误。

这是一个样本抄本:

 ekleog@ekleog:~$ sudo echo a [sudo] password for ekleog: sudo: unable to create sockets: Cannot allocate memory ekleog@ekleog:~$ free -h total used free shared buffers cached Mem: 8.0G 212M 7.8G 0B 0B 43M -/+ buffers/cache: 168M 7.8G Swap: 128M 0B 128M ekleog@ekleog:~$ sudo echo a sudo: unable to create sockets: Cannot allocate memory 

正如你所看到的,分叉是没有问题的,因为shell分支可以free运行,但是sudo似乎无法打开一个socket。 在同一个域中,thunderbird无法打开一个SMTP连接,但是ssh保持隧道连接新请求没有任何问题。

事实上,这个问题源于打开太多的套接字,似乎证实了这个事实,即当closuresThunderbird(保持50个连接来监视所有IMAP文件夹)时,问题就消失了。 另外,重新打开的时候,这个问题不能回避,所以一定要有资源泄漏的地方?

我现在只有一个用户(我),所以我希望OVH的限制不是那么严重。

最后,在“危机”期间,我尝试了运行netstat (不是真正习惯于使用它,所以我可能是错的):

 ekleog@ekleog:~$ netstat -a | wc -l 608 ekleog@ekleog:~$ cat /proc/sys/fs/file-max 1627524 

对我来说, sudo会阻止我感到很奇怪。

你有什么想法如何停止这个? 它不时出现(大约每隔一天),而且变得非常烦人。

显然,问题来自OpenVZ设置,如在/proc/user_beancounters我有一个巨大的failcnt

试图减less依赖于每个程序的开放套接字的数量,我会问另外的问题。

我将在这个答案中分享我的发现,希望这将有助于未来的人。 如果@ EEAA的评论没有及时的观察,这些发现是不可能的。

事实上限制来自OpenVZ软件。 numothersock限制可以在/proc/user_beancounters并根据文档“Parallels Virtuozzo Containers for Linux中的UBC资源” :

numothersock – 最大数量的非TCP套接字(本地套接字,UDP和其他types的套接字)。

你可以检查ss的套接字数量:

ss用于转储套接字统计信息。

 ss -xa | wc -l 

要确定哪个进程绑定了每个套接字:

 sudo ss -xap 

对于我的具体情况,事实certificate,超过25%的套接字限制是由于postfix造成的,所以我减less了/etc/postfix/main.cfdefault_process_limit参数( 这里的相关问题)。

(同义答案,但添加一些诊断信息和search关键字。)

症状

现在的问题是,不能创build新的非TCP套接字,这意味着大多数Unix域套接字用于系统中的进程间通信。 它可能永远都不可重复,因为有时会删除一些套接字,打开几个选项来创build低于限制的新套接字。

症状不限于sudo使用,但会影响您的服务器上运行的大多数或所有网站,并通过套接字连接使用MySQL。 错误消息将如下所示:

 PDOException: SQLSTATE[HY000] [2001] Can't create UNIX socket (12) in […] PDOException: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (12) in […] PHP Warning:  mysqli_connect(): (HY000/2001): Can't create UNIX socket (12) in […] PHP Warning:  mysqli_connect(): (HY000/2002): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (12) in […] 

另外,通过postfix发送和获取电子邮件。 在login阶段, dovecot服务器可能也会失败。 错误消息包括:

 mailq: fatal: inet_addr_local[getifaddrs]: getifaddrs: Cannot allocate memory 

这些错误中的常见元素是错误代码12,意思是“操作系统错误代码12:无法分配内存”,按照错误perror 12 [ 源代码 ]。

查看cat /proc/user_beancounters的输出,它显示了VPS的OpenVZ虚拟化环境限制。 numothersock可能,你会看到很多数量的失败(对我来说超过10,000个)。 这意味着软件试图创build一个套接字,但OpenVZ禁止这样做,因为最大数量的非TCP套接字已经存在。

要查看计入此numothersock资源限制的所有套接字的数量和使用情况,请查看由以下内容生成的输出文件:

 ss --processes --all --socket=udp,unix,unix_dgram,unix_stream > results.txt 

就我而言,这表明大约80%的套接字与postfix和dovecot进程有关。 通过将并发连接的数量从默认值100限制到合理的10,Postfix相关的套接字可以减less到10%左右 – 请参阅说明 。 将该解决scheme应用于postfix( default_process_limit = 10 )并重新启动后,我的套接字从〜1020立即变为〜520。 现在问题解决了。