Memory

sudo:無法創建套接字:無法分配記憶體

  • February 20, 2017

在 OVH 執行的 VPS 上(顯然基於 OpenVZ,/proc/user_beancounters存在),執行的程序相對較少,試圖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 fork to run free,但sudo似乎無法打開套接字。在同一個域中,thunderbird 無法打開 SMTP 連接,但 ssh 不斷地通過隧道傳輸新請求而沒有任何問題。

問題源於打開的套接字過多這一事實似乎得到了以下事實的證實:當關閉 Thunderbird(它保留 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我有numothersock一個巨大的failcnt.

為了減少依賴於每個單獨程序的打開套接字的數量,我將提出單獨的問題。

我將在此答案中分享我的發現,希望對將來的某人有所幫助。如果沒有@EEAA 評論中的及時觀察,這些發現是不可能的。

實際上,限制來自 OpenVZ 軟體。該numothersock限制可以在文件中看到/proc/user_beancounters並根據文件:“Parallels Virtuozzo Containers for Linux 中的 UBC 資源”

numothersock - 非 TCP 套接字(本地套接字、UDP 和其他類型的套接字)的最大數量。

您可以使用以下命令檢查套接字的數量ss

ss用於轉儲套接字統計資訊。

ss -xa | wc -l

要辨識哪個程序綁定每個套接字:

sudo ss -xap

對於我的具體情況,事實證明我對套接字的限制超過 25% 是由於後綴造成的,所以我減少了(相關問題here)中的default_process_limit參數。/etc/postfix/main.cf

引用自:https://serverfault.com/questions/696455