0%

修改系统对应用的限制

应用限制的修改

在调优过程中,在修改应用程序本身参数之前,需要确认系统环境的配置是否满足要求。涉及到内存、文件描述符、文件大小等一系列的限制。而由于系统的保守,一般服务端应用的需求会大于系统的默认限制。那么如何查看和修改,就是首先要解决的问题了。

在 Linux 中,对应用程序的限制,首先可以从 ulimit 着手。

查看用户程序系统限制

使用 ulimit -{op} 来查看对应的变量限制。ulimit 是基于 PAM 的用户限制模块,一般除了一些系统的程序,一般用户都受此限制。先罗列几个常用的:

1
2
3
4
5
ulimit -a # 查看全部
ulimit -n # 文件描述符上限
ulimit -l # 应用程序允许锁定的内存量
ulimit -m # 应用程序允许占用的内存大小
ulimit -s # 应用程序线程栈大小

修改用户程序系统限制

会话级修改

如果要修改该值也很简单,只需要在命令之后跟上需要修改的上限值就可以了:

1
ulimit -n 65535 # 修改当前的文件描述符限制为 65535

但是这种的好处是可以立即生效,但是仅影响本次会话。之后启动的程序都会应用当前的修改,但是重启之后就会失效。

永久修改

对用户程序的这些限制,都是由 /etc/security/limits.conf 所影响。修改这个文件即可达到修改限制的目的了。看一下这个文件长什么样:

1
2
3
4
# example
root hard core 100000
* hard rss 10000
@student hard nproc 20

这里每一行是一个四元表达式:<domain> <type> <item> <value>,说一下四个元素的意义:

  • domain: 指定控制的用户或者,可以使用 %/* 这样的通配符,root 用户不受通配符影响,需要显示指定。
  • type:可选项有三个
    • soft*:控制对应用户该项目的默认的上限(用户可以手动上调至 *hard
    • hard*:控制对应用户该项目的最大上限,需要大于等于 *soft
    • -:设置 - 可以表示 softhard 值统一
  • item:指定不同的条目,如进程数、fd数量、栈大小等等,可以在 limits.conf 的注释和手册中找到详细说明。下面是摘要:
    • core - limits the core file size (KB)
    • data - max data size (KB)
    • fsize - maximum filesize (KB)
    • memlock - max locked-in-memory address space (KB)
    • nofile - max number of open files
    • rss - max resident set size (KB)
    • stack - max stack size (KB)
    • cpu - max CPU time (MIN)
    • nproc - max number of processes
    • as - address space limit (KB)
    • maxlogins - max number of logins for this user
    • maxsyslogins - max number of logins on the system
    • priority - the priority to run user process with
    • locks - max number of file locks the user can hold
    • sigpending - max number of pending signals
    • msgqueue - max memory used by POSIX message queues (bytes)
    • nice - max nice priority allowed to raise to values: [-20, 19]
    • rtprio - max realtime priority
    • chroot - change root to directory (Debian-specific)
  • value:设定的值

limits.conf 的配置十分简单。但是自定义配置的时候并不建议直接修改该文件,可以把需要的配置写入 /etc/security/limits.conf/<file_name>.conf(文件名随意,conf 后缀)这样有利于后期维护和查阅改动点。

系统限制修改

可能会出现这样的情况,即使设置了较大的限制,但是应用最终依然被限制在了较低的阈值。这时候需要确认系统全局的限制。当然一般情况下,系统全局的限制并不容易触及,但是实际需要的话,我们依然可以进行调整。

关于 /proc/sys

系统内核的具体设定值都在 /proc/sys 之下,从网络到文件系统等等方方面面,比如关于网络的就在 /proc/sys/net 之下。不同的文件名对应了不同的配置参数,所以只需要直接查看对应文件就能知道设定值了。比如我们可以查看系统全局能打开的文件描述符数量:

1
2
$cat /proc/sys/fs/file-max
93975

如果要暂时修改,直接更改文件值就可以。影响全局而且不仅仅是当次会话哦。但是一旦重启就会还原回原来的状态。如果想要恒定修改,那么就需要 /etc/sysctl.conf 了。

关于 /etc/sysctl.conf/etc/sysctl.d/

修改 /etc/sysctl.conf 可以达到保存的效果。例如需要修改文件描述符限制更大,可以在文件末尾添加上:fs.file-max=1024000。同样的,做为自定的配置,我们可以将文件放置到 /etc/sysctl.d/ 之下。但是可以和 limits.d 略有不同,可以参考文件夹下的 README,10-<name>.conf 是系统的配置,30-<name>.conf 是其他程序的设定,而一般用户自定义的可以使用 60-<name>.conf 这样的文件。最终会从 10/30/60/sysctl.conf 这样的顺序生效。

总结

以上就是关于如何修改应用级别的限制和系统全局限制的方式了。在调优的时候,需要先看一下关于网络、内存、文件等方面的限制。

谢谢支持!