爱生活,爱分享


高并发下 linux ulimit 优化

haiten 2020-06-07 845浏览 0条评论
首页/正文
分享到: / / / /

前言

系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit 是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内键功能,它具有一套参数集,用于为由它生成的 shell 进程及其子进程的资源使用设置限制。

ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。

ulimit 指令参数:
选项 [options]    含义  
-H   设置硬资源限制,一旦设置不能增加。  
-S   设置软资源限制,设置后可以增加,但是不能超过硬资源设置。    
-a   显示当前所有的 limit 信息。   
-c   最大的 core 文件的大小, 以 blocks 为单位。  
-d   进程最大的数据段的大小,以 Kbytes 为单位。  
-f   进程可以创建文件的最大值,以 blocks 为单位。
-l   最大可加锁内存大小,以 Kbytes 为单位。    
-m   最大内存大小,以 Kbytes 为单位。
-n   Linux操作系统对一个进程可以打开最大文件描述符的数量。  
-p   管道缓冲区的大小,以 Kbytes 为单位。  
-s   线程栈大小,以 Kbytes 为单位。    
-t   最大的 CPU 占用时间,以秒为单位。     
-u   用户最大可用的进程数。    
-v   进程最大可用的虚拟内存,以 Kbytes 为单位。

一、ulimit -n

问题: Can’t open so many files 对于linux运维的同学们,相信都遇到过这个问题。

在Linux下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。系统默认设置成1024,但是这个数字对于服务器特别是大并发的远远是不够的,所以,我们需要结合实际情况修改成一个更大更合理的值。

设置系统所有进程一共可以打开的文件数量 file-max ,可以通过如下方法进行修改:

nano /etc/sysctl.conf
------------------------------------------------------------------
fs.file-max = 6815744
------------------------------------------------------------------

设置一个进程可以打开最大文件描述符的数量:

nano /etc/security/limits.conf
------------------------------------------------------------------
* soft nofile 65536
* hard nofile 65536
------------------------------------------------------------------
注意,切勿设置过大,造成服务器无法启动,小于 /proc/sys/fs/file-max

另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量。

二、ulimit -u

比如我们在模拟大规模http并发测试的时候,客户端会报一个无法fork new proc异常,原因是受到了最大进程1024的限制 解除 Linux 系统的最大进程数:

nano /etc/security/limits.d/90-nproc.conf
------------------------------------------------------------------
*          soft    nproc     102400
root       soft    nproc     102400
------------------------------------------------------------------

三、网络参数调优

调整linux内核参数以便满足高并发访问,解决大量 time_wait 和 syn 攻击问题:

默认值:

------------------------------------------------------------------
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.route.gc_timeout = 300
net.ipv4.ip_local_port_range = 32768 61000
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_max_syn_backlog = 1024
net.core.netdev_max_backlog = 1000
net.core.somaxconn = 128
net.ipv4.tcp_mem = 853440 1137920 1706880
------------------------------------------------------------------
nano /etc/sysconfig/sysctl.conf
在最下面编辑添加:
------------------------------------------------------------------
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.route.gc_timeout = 100
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_mem = 94500000 915000000 927000000
------------------------------------------------------------------

sysctl -p 立刻生效(实践中有遇到不能立刻生效的,需要重启机子才能生效)。

以上配置在实际生产环境中单机1.7w连接数情况下nginx工作正常。

四、设置主机时区(上海时间)

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

原文链接:linux ulimit

原文链接:高并发Linux内核网络参数调优

转载仅为方便学习查看,一切权利属于原作者,本人只是做了整理和排版,如果带来不便请联系我删除。

最后修改:2020-06-07 10:56:33 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

说点什么吧~

评论列表

还没有人评论哦~赶快抢占沙发吧~