ulimit 和 sysctl
Linux 系統參數的修改主要包含兩個部分:
ulimit
:linux shell 的內建命令,它具有一套參數集,用於對 shell 進程及其子進程進行資源限制。(退出 shell 后失效)
例如用戶同時運行了兩個shell終端進程,只在其中一個環境中執行了ulimit – s 100,則該 shell 進程里創建文件的大小會有相應的限制,而另一個 shell 終端包括其上運行的子程序都不會受其影響。
因此 docker-compose.yml 中可以直接設定 ulimit 參數。因為這個參數是 per-process 的。sysctl
:臨時修改整個系統的內核參數(重啟后失效)
另外 linux 還有一個 /proc 文件系統,也是 Linux 內核提供的,用於臨時查看/修改內核參數的機制,可通過修改文件內容臨時修改內核參數。它和 sysctl 功能基本一致。
docker 和宿主機共用內核,因此直接修改宿主機的 sysctl 參數,在容器內也會生效。
docker-compose 只支持設置一部分 sysctl 參數, 這是下層 docker 的限制,所有支持的參數見 Docker - Configure namespaced kernel parameters (sysctls) at runtime,格式見 docker-compose - sysctls
上述兩個命令都是臨時修改,系統重啟后又需要重新設置。要想做到永久修改,需要修改它們對應的默認配置文件:
/etc/security/limits.conf
: ulimit 的默認配置/etc/sysctl.conf
: sysctl 的默認配置
關於這兩個配置的詳細說明,見參考文檔。。
不同的服務器對系統參數的要求也不盡相同,對參數最敏感的,應該是 數據庫/緩存/搜索引擎 這些應用。
下面介紹幾個通用的參數調整。
一、系統的最大連接數限制
大部分數據類應用都需要保持很多 TCP 長連接,Linux 默認的 1024 很可能不夠用,需要做調整。
首先調整用戶級的 max open files
,因為 linux 中一切皆文件,連接也是一個被打開的文件。因此 TCP 連接數上限必須小於用戶打開文件描述符的最大數目
。
修改 /etc/security/limits.conf
文件末尾的這幾個參數來提升上述上限:
# max open files,針對每個用戶的限制,* 表示所有用戶
# 對應 ulimit -n 65535,默認值是 1024
* soft nofile 65535
* hard nofile 65535
然后再修改 /etc/sysctl.conf
中的如下參數(或者直接在末尾添加也行):
# max open files,系統級限制,不能小於 ulimit 中設置的上限
fs.file-max = 65535
# 增大最大連接數
net.core.somaxconn = 10000
# 只要還有內存的情況下,就不使用 swap 交換空間
vm.swappiness = 0