在由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.cf的default_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。 现在问题解决了。