记录linux下通过对limits的设置来优化系统性能

系统中子进程继承父进程的系统限制。只有以root用户运行的进程能任意修改限制。其它进程不能增加硬限制值。这样在一个session中登录进程设置的硬限制值影响该session中的所有进程。

当要优化一个程序的限制值时,首先可以去查看这个程序的限制值是否满足我们想要的条件,如你想看某个程序系统限制值,可以通过进程的pid来查看,命令如下

cat /proc/<pid>/limits 

当然,你首先需要找到程序的pid值,查看某个程序的pid值,你可以通过下面的命令获取
pgrep -l 程序名 (如你想查找nginx的pid值,你可以执行pgrep -l nginx来查找)
如果你不确定你要找的pid是不是你想要的程序的pid,你可以通过如下方式查看

cd /proc/<pid>
ls -alh #目录下的exe所映射的路径就是指的程序路径了

接下来就是对限制的一些修改方法了。
ulimit用命令对于直接去设置其它用户没有什么作用,它只作用于本session的shell环境及本sessionshell环境中的进程,如果要去修改其它用户的系统limits值可以修改/etc/security/limits.conf。
如:想修改所有用户的能打开的最大进程数据及文件句柄数可以vi /etc/security/limits.conf,并添加如下内容
添加的如下如下

#<domain>        <type>  <item>  <value>
* soft nproc 100000
* hard nproc 100000
* soft nofile 100000 
* hard nofile 100000

#soft nproc: 可打开的文件句柄的最大数(软限制)
#hard nproc: 可打开的文件句柄的最大数(硬限制)
#soft nofile:单个用户可用的最大进程数量(软限制)
#hard nofile:单个用户可用的最大进程数量(硬限制)

#<domain> 可以是用户名如www 也可以是组名如 @www
#<type> 有两个值,一个是soft 表示软限制 一个是hard 表示硬限制
#<item> 的值有 core ,data,fsize,memlock,nofile,rss,stack,cpu,nproc,as,maxlogins,maxsyslogins,priority,locks,sigpending,msgqueue,nice,rtprio;下面只作几个介绍
#     core Core文件的最大值设置,单位是(KB)。Core文件是内存的映像,如当程序崩溃时,产生的内存信息文件。
#     data 程序的数据段最大值,就是当程序初始时,给程序的最大初始化内存空间,单位是(KB)。
#     fsize 设置用户能操作的最大文件,单位是(KB)。
#     memlock 设置程序能锁住内存的最大值,也就是程序的个人内存空间的最大值,单位是(KB)。
#     nofile 单个用户可用的最大进程数量
#     nproc  可打开的文件句柄的最大数
#     cpu  设置程序最长占用cpu时间 单位是秒
#     maxlogins  同一时间用户的最大登录数
#     maxsyslogins 设置系统中用户的最大登录数据 
#当你修改/etc/security/limits.conf后。它只会影响新的session。及在新session中运行的程序。不会影响已经运行的程序。

当然我们也可以修改系统级的限制值。如下只记录几个对文件系统限制值的修改

/proc/sys/fs/file-max
决定了当前内核可以打开的最大的文件句柄数
file-max一般为内存大小(KB)的10%来计算
计算方式:

grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'

327601
增加这个值的方式可以如下

echo 427601 > /proc/sys/fs/file-max

或者

echo "fs.file-max=427601" >> /etc/sysctl.conf
sysctl -p

/proc/sys/fs/file-nr (这个文件只做查看用)
1728 0 325288
三个值
第一个:目前分配的文件句柄
第二个:以分配但是是空闲的文件句柄
第三个:系统及的最大文件分配句柄数,也就是当前内核可以打开的最大的文件句柄数(它的值是与/proc/sys/fs/file-max中的值是匹配的,可以通过cat /proc/sys/fs/file-max查看)

/proc/sys/fs/nr_open
指明一个程序能分配的最大文件句柄数
修改这个值的方式可以如下

echo 427601 > /proc/sys/fs/nr_open

或者

echo "fs.fs.nr_open=427601" >> /etc/sysctl.conf
sysctl -p

猜你喜欢

转载自blog.51cto.com/quietnight/2294362