Linux 系统参数调整:ulimit 与 sysctl
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