zoukankan      html  css  js  c++  java
  • [Linux]常用命令之【ulimit(资源限制)】

    1 ulimit 概述

    1.1 概述

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

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

    ulimit 不限制用户可以使用的资源,但可设置对可打开的最大文件数(max open files) 和可同时运行的最大进程数(max user processes)等限制。

    ulimit 用于限制 shell 进程/程序所占用的资源,支持以下资源类型的限制:

    • 所创建的内核文件的大小
    • 进程数据块的大小
    • Shell进程创建文件的大小
    • 内存锁住的大小
    • 常驻内存集的大小
    • 打开文件描述符的数量
    • 分配堆栈的最大大小
    • CPU 时间
    • 单个用户的最大线程数
    • Shell 进程所能使用的最大虚拟内存
    • 同时,它支持对【硬资源】和【软资源】的限制
      作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。
      而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。

    1.2 语法

    ulimit 
        [-a] # 显示/设置 目前设定的所有资源类型的资源限制; 显示当前的各种用户进程限制
        [-c <core文件上限>] # 显示/设定 core文件的最大值,单位为区块(blocks)
        [-H] # 指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限
             # 设定资源的硬性限制,也就是管理员所设下的限制。
        [-d <数据节区/数据段大小>] # 显示/设定 一个进程程序的数据段的最大值,单位为 KB
            Eg: ulimit -d unlimited
        [-f <文件大 小>] # shell所能创建的文件大小的最大值,单位为区块(blocks)
        [-m <内存大小>] # 指定可使用内存的上限,单位为KB
            Eg: ulimit -m unlimited
        [-l <物理内存大小>] # 设置 可锁住的物理内存的最大值
        [-v <虚拟内存大小>] # 设置 Shell可使用的虚拟内存的最大值,单位:KB
            Eg: ulimit -v unlimited
        [-n <文件数目>] # 指定每个进程最多可打开的文件数,默认值: 1024
            Eg: ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
        [-p <缓冲区大小>] # 指定管道缓冲区的大小,单位:block; 1block = 512byte
        [-s <堆栈大小>] # 指定堆栈的上限,单位为KB
            Eg: ulimit -s unlimited
        [-S] # 设置 为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者
        [-t <CPU时间>] # 限制CPU运行时间; 指定每个进程所使用的秒数, 单位:seconds
            # ulimit -t : The maximum amount of cpu time in seconds / 超过硬CPU限制就简单粗暴的让进程“被自杀”了。
            Eg: ulimit -t unlimited
        [-u <程序数目>] # 用户最多可开启的程序数目 / 设定 可以运行的最大并发进程数
    

    2 命令详解

    ulimit -a # 查看系统用户所有限制项及其值
    
    ulimit -n 4096 # 设置用户open files
        用户可以打开文件的最大数目;
        执行该命令非root用户只能设置到4096,想要设置到8192需要sudo权限或者root用户
    
    lsof | wc -l # 查看当前系统打开的文件数量
    lsof -p <pid> | wc -l # 查看当前进程的打开文件数量
        注: lsof只能以root权限执行; 安装lsof: yum install -y lsof
    cat /proc/<PID>/limits # 查看当前进程的可打开的最大资源数(Limit / Soft Limit / Hard Limit / Units)
    cat /proc/sys/fs/file-max # 查看系统总限制打开文件的最大数量
    
    

    3 场景示例

    暂时地生效: 适用于通过 ulimit 命令登录 shell 会话期间。
    永久地生效: 通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中, 即特定于 shell 的用户资源文件

    场景1: [永久生效] 解除 Linux 系统的最大进程数/最大文件打开数限制

    * 代表 针对所有用户
    noproc 代表 最大进程数
    nofile 代表 最大文件打开数

    vi /etc/security/limits.conf #新增如下4行后,重新登录OS#
          * soft noproc 11000
          * hard noproc 11000
          
          * soft nofile 4100
          * hard nofile 4100
    

    场景2: [永久生效] 配置环境变量 => 使ulimit命令配置永久生效

    • [方式1 - 系统环境变量] 修改所有 linux 用户的环境变量文件
    vi /etc/profile
        ulimit -u 10000
        ulimit -n 4096
        ulimit -d unlimited
        ulimit -m unlimited
        ulimit -s unlimited
        ulimit -t unlimited
        ulimit -v unlimited
    
    source /etc/profile # 使环境变量的配置生效
    
    
    • [方式2 - (当前)用户的环境变量]
    vi ~/.bash_profile
        ulimit -n 1024
    
    source ~/.bash_profile
    
    重新登陆
    

    场景3: [暂时生效]

    • 把Linux中某用户的最大进程数设为10000个
    ulimit -u 10240
    
    • 设置每个进程可打开的文件数目为4096

    default: 1024

    ulimit -n 4096 
    

    对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言, 最好通过使用 ulimit -n xx 修改每个进程可打开的文件数,缺省值是 1024。

    • 设置其它资源为无限制(unlimited)【推荐】
    数据段长度: ulimit -d unlimited
    最大内存大小: ulimit -m unlimited
    堆栈大小: ulimit -s unlimited
    CPU 时间: ulimit -t unlimited
    虚拟内存: ulimit -v unlimited
    

    场景4: 让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制

    vi /etc/ssh/sshd_config
        把 UserLogin 的值改为 yes,并把 # 注释去掉
    
    /etc/init.d/sshd restart # 重启 sshd 服务
    

    X 参考/推荐文献

  • 相关阅读:
    PHPUnit
    变长参数处理
    springMVC课程笔记(二)springMVC组件配置
    URL编码以及GET和POST提交乱码解决方案
    springMVC课程笔记(一)springMVC架构原理分析
    ELK(ElasticSearch, Logstash, Kibana) 实现 Java 分布式系统日志分析架构
    Java 标准 IO 流编程一览笔录( 下 )
    Java 标准 IO 流编程一览笔录( 上 )
    Zookeeper系列(十四)Zookeeper的数据与存储
    Zookeeper系列(十三)Zookeeper的请求处理
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/13773935.html
Copyright © 2011-2022 走看看