Linux 系统参数调整:ulimit 与 sysctl

ulimit 和 sysctl

Linux 系统参数的修改主要包含两个部分:

  1. ulimit:linux shell 的内建命令,它具有一套参数集,用于对 shell 进程及其子进程进行资源限制。(退出 shell 后失效)
    例如用户同时运行了两个shell终端进程,只在其中一个环境中执行了ulimit – s 100,则该 shell 进程里创建文件的大小会有相应的限制,而另一个 shell 终端包括其上运行的子程序都不会受其影响。
    因此 docker-compose.yml 中可以直接设定 ulimit 参数。因为这个参数是 per-process 的。
  2. sysctl:临时修改整个系统的内核参数(重启后失效)
    另外 linux 还有一个 /proc 文件系统,也是 Linux 内核提供的,用于临时查看/修改内核参数的机制,可通过修改文件内容临时修改内核参数。它和 sysctl 功能基本一致。
    docker 和宿主机共用内核,因此直接修改宿主机的 sysctl 参数,在容器内也会生效。
    docker-compose 只支持设置一部分 sysctl 参数, 这是下层 docker 的限制,所有支持的参数见 Docker - Configure namespaced kernel parameters (sysctls) at runtime,格式见 docker-compose - sysctls

上述两个命令都是临时修改,系统重启后又需要重新设置。要想做到永久修改,需要修改它们对应的默认配置文件:

  1. /etc/security/limits.conf: ulimit 的默认配置
  2. /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

参考

posted @ 2020-02-11 21:11  於清樂  阅读(3380)  评论(0编辑  收藏  举报