linux下limit知识
一般新机器,在非root用户下部署java项目之前,一定需要新调整下机器的参数,这里与我们的java进程息息相关的就是 /etc/ecurity/limits
这里的配置。
/etc/ecurity/limits
限制住了系统用户下所有的文件句柄数,线程数,cpu时间片等等。我们这里只需要关注文件句柄数和线程数。
- 句柄数限制着我们的socket连接、文件IO等等。
- 线程数则会限制我们java的新启动线程和请求,每个请求就是一个线程。
ulimit -a
使用
可以查看系统的资源限制,如下:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256507
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
上面的 open files (-n) 65536
和 max user processes (-u) 4096
是我们重点关注的。它限制了文件最大句柄数和线程数。
修改limit配置(针对centos6及其以上系统)
编辑 /etc/security/limits.conf
, 修改如下配置:
# - "soft" for enforcing the soft limits
# - "hard" for enforcing hard limits
# - nofile - max number of open file descriptors
# - nproc - max number of processes
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
注意:还需要修改一个地方,否则我们进程的最大限制会被重置掉,笔者之前在这个地方踩了不少坑。需要编辑 /etc/security/limits.d/
下的文件。
* soft nproc 4096
root soft nproc unlimited
这个 *
会有一个软线程的最大限制为 4096,会覆盖 /etc/security/limits.conf
里的配置。一般程序启动的线程都是属于 soft nproc
。
修改了limit后系统是否需要重新启动?
网上的说法是修改了 limit 后,重启linux系统才会奏效。事实上不是这样,修改了之后,新启动的进程会使用新的limit限制参数,而之前起的进程还是会使用老的配置,所以只需要重启进程即可。
查看系统线程使用的常用指令
# 查看linux下各个用户的线程使用情况
ps -eLo ruser|awk 'NR>1'|sort|uniq -c
# 查看当前进程的资源限制
cat /proc/{pid}/limit
# 查看进程的线程数
cat /proc/{pid}/status | grep Threads
# 查看进程的句柄数
cat /proc/{pid}/fd | wc -l
使用 /proc/pid/
排查问题
可以评估一个应用的指标情况,可以看他的句柄数、线程数等等, 在 /proc/{pid}/fd/
可以查看进程所有打开的文件,socket连接也是一个文件,当存在很多socket没有释放的话,说明open 文件没有关闭或者释放。