• Linux Ulimit控制shell执行程序的资源


    系统的默认配置是足以满足日常使用的,但是在进行高并发的网络编程时,超出连接个数会遇到最大打开文件数限制报错、无法创建新连接(超出最大进程数)、系统资源分配报错!

    前提:拥有Root权限

    在这里插入图片描述

    Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux用户的最大进程数,我们可以用ulimit来显示当前的各种用户进程限制。

    Linux是有文件句柄限制的,默认是1024,作为一台生产服务器,在linux下面部署应用的时候,很容易达到这个数量的限制,然后报错 error: too many open files,所以应当把这个值改大一些,在高负载情况下要设置为更高,但最高只能为65535。有人说这里默认的1024是系统的限制,也有人说是用户的限制,其实这个是用户的限制,严格的说这是当前用户准备要运行的程序的限制。

    简单操作

    使用ulimit -a可以查看当前系统的所有限制值,使用ulimit -n可以查看当前的最大打开文件数。

    1、修改最大用户进程数和最大文件数限制

    ulimit 的作用:
    ulimit:显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何的超越都导致进程的终止。

    # 语法格式
    ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大 小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆栈大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]
    -> ulimit -a												# -a 列出所有当前资源极限
    
    core file size          (blocks, -c) 0						#-c 设置core文件的最大值.单位:blocks
    data seg size           (kbytes, -d) unlimited				#-d 设置一个进程的数据段的最大值.单位:kbytes
    scheduling priority             (-e) 0						#-e 调度优先级上限,这里的优先级指 NICE 值。只针对普通用户进程有效
    file size               (blocks, -f) unlimited				#-f Shell 创建文件的文件大小的最大值,单位:blocks
    pending signals                 (-i) 385862					#-i 被挂起/阻塞的最大信号数量
    max locked memory       (kbytes, -l) unlimited				#-l 可以锁住的物理内存的最大值
    max memory size         (kbytes, -m) unlimited				#-m 可以使用的常驻内存的最大值,单位:kbytes
    open files                      (-n) 300000					#-n 每个进程可以同时打开的最大文件数
    pipe size            (512 bytes, -p) 8						#-p 设置管道的最大值,单位为block,1block=512bytes
    POSIX message queues     (bytes, -q) 819200					#-q POSIX 消息队列的最大值
    real-time priority              (-r) 0						#-r 限制程序实时优先级,只针对普通用户进程有效
    stack size              (kbytes, -s) 8192					#-s 指定堆栈的最大值:单位:kbytes
    cpu time               (seconds, -t) unlimited				#-t 指定每个进程所使用的秒数,单位:seconds
    max user processes              (-u) 655360					#-u 可以运行的最大并发进程数
    virtual memory          (kbytes, -v) unlimited				#-v Shell可使用的最大的虚拟内存,单位:kbytes
    file locks                      (-x) unlimited				#-x 文件锁的最大数量
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2、修改最大线程数和最大文件数限制

    -> vim /etc/security/limits.conf 
     # 添加如下的行
     * soft noproc 65535 
     * hard noproc 65535
     * soft nofile 65535
     * hard nofile 65535
    其中:
    noproc代表用户最大线程数限制
    nofile代表最大打开文件数限制
    " * "代表对所有用户生效
    echo "* soft nofile 65535" >>/etc/security/limits.conf &&  echo "* hard nofile 65535" >>/etc/security/limits.conf 
    ✔ 终端
    直接输入ulimit -SHn 65535可以更改,但这种方式重启机器后更改值会失效,重新回到1024;  S表示软限制;H表示硬限制;如果不指明,则表示软硬皆设置
    编辑/etc/profile,在文件最后增加 echo "ulimit -SHn 65535" >>/etc/profile && source /etc/profile。
    
    对于最大打开文件数限制只需要更改上面的参数即可,但对于用户最大线程数限制还需要根据系统不同修改以下文件:
    ✔ centos7系统下操作:
    在centos7系统中,ulimit下面的nproc的数值是通过 /etc/security/limits.d/20-nproc.conf 来控制的
    -> cat /etc/security/limits.d/20-nproc.conf
    *          soft    nproc     1024
    root       soft    nproc     unlimited
    需要编辑 /etc/security/limits.d/20-nproc.conf 文件将限制值改大!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    3、修改网络内核对TCP/UDP连接的限制

    在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,再也无法成功建立新的TCP连接的现象。
    分析:Linux内核编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口范围限制。
    内核参数的优化
    修改/etc/sysctl.conf文件,/etc/sysctl.conf 是用来控制linux网络的配置文件,对于依赖网络的程序(如web服务器和cache服务器)非常重要~

    -> sudo vim /etc/sysctl.conf 
    # 将原内容批注并写入如下内容
    net.ipv4.ip_local_port_range = 1024 65535
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    net.ipv4.tcp_fin_timeout = 10
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_timestamps = 0
    net.ipv4.tcp_window_scaling = 0
    net.ipv4.tcp_sack = 0
    net.core.netdev_max_backlog = 30000
    net.ipv4.tcp_no_metrics_save = 1
    net.core.somaxconn = 10240
    net.ipv4.tcp_syncookies = 0
    net.ipv4.tcp_max_orphans = 262144
    net.ipv4.tcp_max_syn_backlog = 262144
    net.ipv4.tcp_synack_retries = 2
    net.ipv4.tcp_syn_retries = 2
    sysctl -p /etc/sysctl.conf
    sysctl -w net.ipv4.route.flush=1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    /etc/security/limits.conf 配置详解

    # 格式:
    <domain> <type> <item> <value>
    	✔ domain 是指生效实体
    		用户名,也可以通过 @group 指定用户组
    		使用 * 表示默认值
    ✔ type 指限制类型
    		soft 软限制
    		hard 硬限制
    ✔ item 限制资源
    core	 	 同 ulimit -c
    data 	 	 同 ulimit -d
    fsize 	 	 同 ulimit -f
    memloc	 	 同 ulimit -l
    nofile 	 	 同 ulimit -n
    stack 	 	 同 ulimit -s
    cpu 	 	 同 ulimit -t
    nproc	 	 同 ulimit -u
    maxlogins    指定用户可以同时登陆的数量
    maxsyslogins 系统可以同时登陆的用户数
    priority	 用户进程运行的优先级
    locks 		 用户可以锁定的文件最大值
    sigpengding  同 ulimit -i
    msgqueue 	 同 ulimit -q
    
    # 参考实例
    显示系统资源的设置					  	ulimit -a 
    设置单一用户程序数目上限 			    ulimit -u 500
    将每个进程可以打开的文件数目加大到4096 	ulimit -n 4096 
    指定可使用的虚拟内存上限为12800KB 	   	ulimit -v 12800 
    指定CPU使用时间的上限为2s 			 	ulimit -t 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    Life is not satisfactory, is the lack of RMB!

  • 相关阅读:
    【办公类-41-01】20240312 每篇pdf文献有多少字(pdf转TXT 求字数)
    mapreduce中的ReduceTask工作机制(Hadoop)
    计算性能的提升之异步计算与并行计算(MXNet)
    FlinkSQL -- joins----flink-1.13.6
    Mac清理内存管理工具CleanMyMac X2024
    若依微服务版的快速构建
    Edge 无法登录/同步问题【一招搞定】
    Linux环境下Qt应用程序打包与发布
    总结:nginx配置
    项目实战第三十六讲:基于 Sharding-JDBC 的商品分库⽅案
  • 原文地址:https://blog.csdn.net/qq_50573146/article/details/125555617