精华内容
下载资源
问答
  • ulimit
    2021-05-11 19:04:27

    高手指教:

    解决的问题:

    现有一程序P 长期在服务器上运行,目前经常是每1天死掉一次(段错误)。

    目前解决方法:

    用SecureCRT开一个终端,并在服务其上设置ulimit -c nulimited,然后启动程序P。用ulimite -a 命令查询结果如下:

    core file size       (blocks, -c) unlimited

    data seg size           (kbytes, -d) unlimited

    file size             (blocks, -f) unlimited

    pending signals                 (-i) 1024

    max locked memory    (kbytes, -l) 32

    ............

    表明core文件可以生成。

    并测试利用kill -6 pid能够core文件。

    目前的困难:

    当运行ulimit -c nulimited终端 (并且该终端将程序P启动到后台了 ./P &)关闭,程序P死掉后并没有生成 core文件。

    经试验后发现ulimit 命令与终端有关。

    高手指教:

    如何设置能够生成core 文件,与终端无关

    即,程序启动,关闭终端,当程序死掉(段错误)后能够生成core文件。

    /etc/security/limits.conf (中设置 redhat衍生系linux)

    /etc/profile中的:

    # No core files by default

    ulimit -S -c 0 > /dev/null 2>&1

    注释掉上面一行。

    还有其他UNIX类操作系统也有自己的配置文件可以设置。

    ------------------------------------------------------------------------------------------------------------------

    gdb core 多线程

    在linux环境下调试多线程,总觉得不像.NET那么方便。这几天就为找一个死锁的bug折腾好久,介绍一下用过的方法吧。

    多线程如果dump,多为段错误,一般都涉及内存非法读写。可以这样处理,使用下面的命令打开系统开关,让其可以在死掉的时候生成core文件。

    ulimit -c unlimited

    这样的话死掉的时候就可以在当前目录看到core.pid(pid为进程号)的文件。接着使用gdb:

    gdb ./bin ./core.pid

    进去后,使用bt查看死掉时栈的情况,在使用frame命令。

    还有就是里面某个线程停住,也没死,这种情况一般就是死锁或者涉及消息接受的超时问题(听人说的,没有遇到过)。遇到这种情况,可以使用:

    gcore pid (调试进程的pid号)

    手动生成core文件,在使用pstack(linux下好像不好使)查看堆栈的情况。如果都看不出来,就仔细查看代码,看看是不是在if,return,break,continue这种语句操作是忘记解锁,还有嵌套锁的问题,都需要分析清楚了。

    最后,说一句,静心看代码,捶胸顿足是没有用的。

    -------------------------------------

    1,说明:

    ulimit用于shell启动进程所占用的资源.

    2,类别:

    shell内建命令

    3,语法格式:

    ulimit [-acdfHlmnpsStvw] [size]

    4,参数介绍:

    -H 设置硬件资源限制.

    -S 设置软件资源限制.

    -a 显示当前所有的资源限制.

    -c size:设置core文件的最大值.单位:blocks

    -d size:设置数据段的最大值.单位:kbytes

    -f size:设置创建文件的最大值.单位:blocks

    -l size:设置在内存中锁定进程的最大值.单位:kbytes

    -m size:设置可以使用的常驻内存的最大值.单位:kbytes

    -n size:设置内核可以同时打开的文件描述符的最大值.单位:n

    -p size:设置管道缓冲区的最大值.单位:kbytes

    -s size:设置堆栈的最大值.单位:kbytes

    -t size:设置CPU使用时间的最大上限.单位:seconds

    -v size:设置虚拟内存的最大值.单位:kbytes 5,简单实例:

    5.举例

    在Linux下写程序的时候,如果程序比较大,经常会遇到“段错误”(segmentation fault)这样的问题,这主要就是由于Linux系统初始的堆栈大小(stack size)太小的缘故,一般为10M。我一般把stack size设置成256M,这样就没有段错误了!命令为:

    ulimit   -s 262140

    如果要系统自动记住这个配置,就编辑/etc/profile文件,在 “ulimit -S -c 0 > /dev/null 2>&1”行下,添加“ulimit   -s 262140”,保存重启系统就可以了!

    1]在RH8的环境文件/etc/profile中,我们可以看到系统是如何配置ulimit的:

    #grep ulimit /etc/profile

    ulimit -S -c 0 > /dev/null 2>&1

    这条语句设置了对软件资源和对core文件大小的设置

    2]如果我们想要对由shell创建的文件大小作些限制,如:

    #ll h

    -rw-r--r-- 1 lee lee 150062 7月 22 02:39 h

    #ulimit -f 100 #设置创建文件的最大块(一块=512字节)

    #cat h>newh

    File size limit exceeded

    #ll newh

    -rw-r--r-- 1 lee lee 51200 11月 8 11:47 newh

    文件h的大小是150062字节,而我们设定的创建文件的大小是512字节x100块=51200字节

    当然系统就会根据你的设置生成了51200字节的newh文件.

    3]可以像实例1]一样,把你要设置的ulimit放在/etc/profile这个环境文件中.

    用途

    设置或报告用户资源极限。

    语法

    ulimit [ -H ] [ -S ] [ -a ] [ -c ] [ -d ] [ -f ] [ -m ] [ -n ] [ -s ] [ -t ] [ Limit ]

    描述

    ulimit 命令设置或报告用户进程资源极限,如 /etc/security/limits 文件所定义。文件包含以下缺省值极限:

    fsize = 2097151

    core = 2097151

    cpu = -1

    data = 262144

    rss = 65536

    stack = 65536

    nofiles = 2000

    当新用户添加到系统中时,这些值被作为缺省值使用。当向系统中添加用户时,以上值通过 mkuser 命令设置,或通过 chuser 命令更改。

    极限分为软性或硬性。通过 ulimit 命令,用户可将软极限更改到硬极限的最大设置值。要更改资源硬极限,必须拥有 root 用户权限。

    很多系统不包括以上一种或数种极限。 特定资源的极限在指定 Limit 参数时设定。Limit 参数的值可以是每个资源中指定单元中的数字,或者为值 unlimited。要将特定的 ulimit 设置为 unlimited,可使用词 unlimited。

    注:在 /etc/security/limits 文件中设置缺省极限就是设置了系统宽度极限, 而不仅仅是创建用户时用户所需的极限。

    省略 Limit 参数时,将会打印出当前资源极限。除非用户指定 -H 标志,否则打印出软极限。当用户指定一个以上资源时,极限名称和单元在值之前打印。如果未给予选项,则假定带有了 -f 标志。

    由于 ulimit 命令影响当前 shell 环境,所以它将作为 shell 常规内置命令提供。如果在独立的命令执行环境中调用该命令,则不影响调用者环境的文件大小极限。以下示例中正是这种情况:

    nohup ulimit -f 10000

    env ulimit 10000

    一旦通过进程减少了硬极限,若无 root 特权则无法增加,即使返回到原值也不可能。

    关于用户和系统资源极限的更多信息,请参见 AIX 5L Version 5.3 Technical Reference: Base Operating System and Extensions Volume 1 中的 getrlimit、setrlimit 或 vlimit 子例程。

    标志

    -a     列出所有当前资源极限。

    -c     以 512 字节块为单位,指定核心转储的大小。

    -d     以 K 字节为单位指定数据区域的大小。

    -f     使用 Limit 参数时设定文件大小极限(以块计),或者在未指定参数时报告文件大小极限。缺省值为 -f 标志。

    -H     指定设置某个给定资源的硬极限。如果用户拥有 root 用户权限,可以增大硬极限。任何用户均可减少硬极限。

    -m     以 K 字节为单位指定物理存储器的大小。

    -n     指定一个进程可以拥有的文件描述符的数量的极限。

    -s     以 K 字节为单位指定堆栈的大小。

    -S     指定为给定的资源设置软极限。软极限可增大到硬极限的值。如果 -H 和 -S 标志均未指定,极限适用于以上二者。

    -t     指定每个进程所使用的秒数。

    退出状态

    返回以下退出值:

    0     成功完成。

    >0     拒绝对更高的极限的请求,或发生错误。

    示例

    要将文件大小极限设置为 51,200 字节,输入:

    ulimit -f 100

    更多相关内容
  • 有助于管理ulimit配置的角色。 例子 --- # Example of how to use the role - hosts: myhost vars: ulimit_config: - domain: '*' type: soft item: core value: 0 - domain: '*' type: hard item: rss ...
  • Linux ulimit命令 Linux ulimit命令用于控制shell程序的资源。 ulimit为shell内建指令,可用来控制shell执行程序的资源。 语法 ulimit [-aHS][-c ][-d ][-f ][-m ][-n ][-p ][-s ][-t ][-u ][-v ] 参数: -a 显示...
  • 为提高性能,可以根据设备资源情况,设置各linux用户的最大进程数,我们可以用ulimit来显示当前的各种用户进程限制。 ulimit为shell内建命令,可用来控制shell执行程序的资源。 语法格式:ulimit [参数] 常用参数...
  • ulimit设置句柄数

    2021-03-23 14:09:34
    放到服务器上运行一段时间抛出Toomanyopenfiles的异常。...放到服务器上运行一段时间抛出Toomanyopenfiles的异常。  异常信息简单的信息如下:  I/Oexception(java.net.SocketException)caughtwhenprocessingrequest:...
  • ulimit

    2019-09-26 20:36:06
    man ulimit:看到的是库函数里的帮助<ulimit.h> info ulimit 跟man ulimit一样,看到的是那个函数long ulimit(int cmd,long newLimit) 这个函数已经obsolete(废弃),或者叫deprecated(不鼓励使用).因为它有替代...

    man ulimit:看到的是库函数里的帮助<ulimit.h>

    info ulimit 跟man ulimit一样,看到的是那个函数long ulimit(int cmd,long newLimit)

    这个函数已经obsolete(废弃),或者叫deprecated(不鼓励使用).因为它有替代者:getrlimit(2), setrlimit(2), sysconf(3)

    实际上,还有一个ulimit,它是shell的内置命令

    type ulimit: ulimit is a shell builtin
    help ulimit: 查看ulimit的帮助信息

    在shell中有6种方式提供帮助,应该根据type的种类来决定用man还是用help

      两次tab键

      help xxx :只能查看内置命令,help列出的全是精华,看它一晌会对bash有更好的巩固理解

      info xxx :在控制台下直接看帮助文档,外部命令和内部命令都适用

      man xxx :像看书一样看帮助,只适用于外部命令,man和info内容一样,只是表现方式略有差异.输入man,按两次tab键可以看到以man开头的命令.输入manpath可以看到man的目录,位于全局目录下的man命令就是在manpath所列路径中查找文件的.

      echo $PATH :然后可以cd到全局变量下面,去看有哪些可执行的命令

      一些小玩意:which,whereis,type查看命令的位置,类型等

    =====================help ulimit===================

    ulimit: ulimit [-SHabcdefilmnpqrstuvxT] [limit]
        Modify shell resource limits.对shell的子进程资源加以限制
        
        Provides control over the resources available to the shell and processes
        it creates, on systems that allow such control.
        
        Options:

      硬限制其实就是最大值,软限制就是当前值,不知道是谁给起个玄乎的名字.
          -S    use the `soft' resource limit 软限制,不得超过硬限制,设置之后还可以更改
          -H    use the `hard' resource limit 硬限制,设置时只能减少资源,设置之后只能改小,不能改大.如果不带参数,则默认参数为-H.软限制肯定小于等于硬限制,所以更改硬限制时,软限制可能会相应改变.
          -a    all current limits are reported 查看现在的全部限制
          -b    the socket buffer size 套接字缓冲区大小
          -c    the maximum size of core files created 内核文件大小
          -d    the maximum size of a process's data segment 进程数据段大小
          -e    the maximum scheduling priority (`nice') 最低的优先级
          -f    the maximum size of files written by the shell and its children 文件输出大小
          -i    the maximum number of pending signals
          -l    the maximum size a process may lock into memory
          -m    the maximum resident set size 常驻集大小
          -n    the maximum number of open file descriptors
          -p    the pipe buffer size 管道缓冲区大小
          -q    the maximum number of bytes in POSIX message queues
          -r    the maximum real-time scheduling priority
          -s    the maximum stack size 栈的最大值
          -t    the maximum amount of cpu time in seconds 运行时间
          -u    the maximum number of user processes 本进程及其子进程最大进程数
          -v    the size of virtual memory 虚存最大值
          -x    the maximum number of file locks 最大文件锁,也就是最多对多少文件加锁
          -T    the maximum number of threads 最大线程数
        
        Not all options are available on all platforms. 不同的平台对ulimit有不同的支持,ulimit并非所有的选项都能扩平台.
        
        If LIMIT is given, it is the new value of the specified resource; the
        special LIMIT values `soft', `hard', and `unlimited' stand for the
        current soft limit, the current hard limit, and no limit, respectively.
        Otherwise, the current value of the specified resource is printed.  If
        no option is given, then -f is assumed.

      如果在命令中给出了限制,那就是set;否则,那就是get.如果没有选项,那就默认-f选项,显示本进程树正在写的文件.
        
        Values are in 1024-byte increments, except for -t, which is in seconds,
        -p, which is in increments of 512 bytes, and -u, which is an unscaled
        number of processes.

      上面那些参数设值以1024byte递增(除了-t和-p选项,-t的单位是秒,-p的递增单位是512字节)
        
        Exit Status:
        Returns success unless an invalid option is supplied or an error occurs.

      如果运行成功,返回0.否则返回错误状态

    ====================ulimit -a=================================

    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) 15176
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    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) 15176
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    ====================ulimit -v ==============

    如果资源设置的少了,shell的很多外部命令都用不了,因为启动不了啊.输入help看到的全是内置命令,这些内置命令以就可以使用,因为他们是内置的,不会开启子进程去执行.资源设置少了,错误可能发生在程序运行的不同时期,于是就导致了不同的现象,下面这个例子,在虚拟内存逐渐变大的过程中出现了好几种错误.如果ulimit -Sv 1,就连按tab键出提示都用不了了.

    $ ulimit -Sv 1
    $ ls
    bash: /bin/ls: Argument list too long
    $ ulimit -Sv 10
    $ ls
    Segmentation fault
    $ ulimit -Sv 30
    $ ls
    Segmentation fault
    $ ulimit -Sv 300
    $ ls
    Segmentation fault
    $ ulimit -Sv 3000
    weidiao@ideapad:~/Desktop$ ls
    ls: error while loading shared libraries: libacl.so.1: failed to map segment from shared object
    $ ulimit -Sv 30000

     

    转载于:https://www.cnblogs.com/weiyinfu/p/5018738.html

    展开全文
  • ulimit详解

    千次阅读 2021-08-11 11:04:07
    如,ulimit -Hs 64;限制硬资源,线程栈大小为64K。 -S: 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。如,ulimit -Sn 32;限制软资源,32个文件描述符。 -a: 显示当前所有的limit信息。如,ulimit -a...

    语法

    -H: 设置硬资源限制,一旦设置不能增加。如,ulimit -Hs 64;限制硬资源,线程栈大小为64K。
    -S: 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。如,ulimit -Sn 32;限制软资源,32个文件描述符。
    -a: 显示当前所有的limit信息。如,ulimit -a;显示当前所有的limit信息。
    -c: 最大的core文件的大小, 以blocks为单位。如,ulimit -c unlimited;对生成的core文件的大小不进行限制。
    -d: 进程最大的数据段的大小,以Kbytes为单位。如,ulimit -d unlimited;对进程的数据段大小不进行限制。
    -f: 进程可以创建文件的最大值,以 blocks 为单位。如,ulimit -f 2048;限制进程可以创建的最大文件大小为2048 blocks。
    -l: 最大可加锁内存大小,以Kbytes为单位。如,ulimit -l 32;限制最大可加锁内存大小为32Kbytes。
    -m: 最大内存大小,以Kbytes为单位。如,ulimit -m unlimited;对最大内存不进行限制。
    -n: 可以打开最大文件描述符的数量。如,ulimit -n 128;限制最大可以使用128个文件描述符。
    -p: 管道缓冲区的大小,以Kbytes为单位。如,ulimit -p 512;限制管道缓冲区的大小为512Kbytes。
    -s: 线程栈大小,以Kbytes为单位。如,如,ulimit -s 512;限制线程栈的大小为512Kbytes。
    -t: 最大的CPU占用时间,以秒为单位。 如,ulimit -t unlimited;对最大的CPU占用时间不进行限制。
    -u: 用户最大可用的进程数。如,ulimit -u 64;限制用户最多可以使用64个进程。
    -v: 进程最大可用的虚拟内存,如,以Kbytes为单位。如,ulimit -v 200000;限制最大可用的虚拟内存为200000Kbytes。
    unlimited 是一个特殊值,用于表示不限制 
    

    ulimit 作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?事实上,ulimit 限制的是当前 shell 进程以及其派生的子进程。举例来说,如果用户同时运行了两个 shell 终端进程,只在其中一个环境中执行了 ulimit -s 100,则该 shell 进程里创建文件的大小收到相应的限制,而同时另一个 shell 终端包括其上运行的子程序都不会受其影响。

    Shell 1

    $ ll -h newfile 
    -rw-r--r--. 1 root root 223K 4月  23 09:16 newfile
    $ ulimit -f 100
    $ cat newfile > shell1
    File size limit exceeded (core dumped)
    $ ll -h shell1
    -rw-r--r--. 1 root root 100K 4月 23 09:20 shell1
    

    Shell 2

    $ cat newfile > shell2
    $ ll -d shell2 
    -rw-r--r--. 1 root root 227690 4月  23 09:23 shell2
    $ ll -h shell2 
    -rw-r--r--. 1 root root 223K 4月  23 09:23 shell2
    

    那么,是否有针对某个具体用户的资源加以限制的方法呢?答案是有的,临时生效(不限制打开文件大小限制):

    $ ulimit -f unlimited
    

    或通过修改系统的/etc/security/limits.conf配置文件。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述,格式如下:

    <domain> <type> <item> <value>
    

    domain 表示用户或者组的名字,还可以使用 * 作为通配符。Type 可以有两个值,soft 和 hard。Item 则表示需要限定的资源,可以有很多候选值,如 stack,cpu,nofile 等等,分别表示最大的堆栈大小,占用的 cpu 时间,以及打开的文件数。通过添加对应的一行描述,则可以产生相应的限制。例如:

    * hard noflle 100
    

    该行配置语句限定了任意用户所能创建的最大文件数是 100。现在已经可以对进程和用户分别做资源限制了,看似已经足够了,其实不然。很多应用需要对整个系统的资源使用做一个总的限制,这时候我们需要修改/proc下的配置文件。/proc目录下包含了很多系统当前状态的参数,例如/proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range等等,从文件的名字大致可以猜出所限制的资源种类。由于该目录下涉及的文件众多,在此不一一介绍。有兴趣的读者可打开其中的相关文件查阅说明。

    使用ulimit限制shell的内存使用

    在这一小节里向读者展示如何使用-d,-m 和-v 选项来对shell所使用的内存进行限制。首先我们来看一下不设置ulimit限制时调用ls命令的情况:

    $ ll shell1 -l
    -rw-r--r--. 1 root root 227690 4月  23 09:16 shell1
    

    大家可以看到此时的 ls 命令运行正常。下面设置 ulimit:

    $ ulimit -d 1000 -m 1000 -v 1000
    这里再温习一下前面章节里介绍过的这三个选项的含义:
    -d:设置数据段的最大值。单位:KB。
    -m:设置可以使用的常驻内存的最大值。单位:KB。
    -v:设置虚拟内存的最大值。单位:KB。
    

    通过上面的 ulimit 设置我们已经把当前 shell 所能使用的最大内存限制在 1000KB 以下。接下来我们看看这时运行 ls 命令会得到什么样的结果:

    $ ll shell1 -l
    Segmentation fault (core dumped)
    

    使用ulimit限制程序所能创建的socket数量

    考虑一个现实中的实际需求。对于一个 C/S 模型中的 server 程序来说,它会为多个 client 程序请求创建多个 socket 端口给与响应。如果恰好有大量的 client 同时向 server 发出请求,那么此时 server 就会需要创建大量的 socket连接。但是在 Linux 下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。在 Linux 下创建一个新的socket 连接,实际上就是创建一个新的文件描述符。而Linux对单进程能打开的文件描述符是有限制的,默认单进程能打开的最大文件数量为1024,。ulimit 并没有哪个选项直接说是用来限制socket的数量的。但是,我们有-n这个选项,它是用于限制一个进程所能打开的文件描述符的最大值。如下所示(查看某个进程当前打开的文件描述符信息):

    $ ll /proc/36766/fd
    总用量 0
    lr-x------. 1 root root 64 4月  23 09:31 0 -> /dev/null
    l-wx------. 1 root root 64 4月  23 09:31 1 -> /mydata/localhost.localdomain.err
    lrwx------. 1 root root 64 4月  23 09:31 10 -> /mydata/ib_logfile1
    lrwx------. 1 root root 64 4月  23 09:31 11 -> socket:[115703]
    lrwx------. 1 root root 64 4月  23 09:31 12 -> /tmp/ibLxLFBt (deleted)
    l-wx------. 1 root root 64 4月  23 09:31 13 -> /mydata/mysql-bin.000001
    lrwx------. 1 root root 64 4月  23 09:31 14 -> socket:[115704]
    lrwx------. 1 root root 64 4月  23 09:31 15 -> /mydata/mysql/host.MYI
    .......................
    

    因此,我们可以通过使用ulimit -n来限制但进程所能打开的最大文件描述符数量,默认单进程打开的文件描述符为1024,就是代表单个进程只能同时最多只能维持1024甚至更少(因为有其它文件的句柄被打开)。如果开启4个进程维持用户链接,那么整个应用能够同时维持的连接数不会超过4*1024个,也就是说最多只能支持4×1024个用户在线。可以增大这个设置以便服务能够维持更多的TCP连接,从而达到限制socket创建的数量。

    如果单个进程打开的文件句柄数量超过了系统定义的值,就会提到“too many files open”的错误提示。如何知道当前进程打开了多少个文件句柄呢?通过lsof命令可以帮你查看:

    $ lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr| head -n 2
        126 7015
         93 1831
    

    上面说明了,7015进程打开了126个文件描述符,你可以通过ps命令看看7015这个进程是什么服务(这里都是以我的举例说明的,你在实验时要根据自己的进程进行查看,相信你有这个意识)。

    修改单进程所能打开的最大文件数

    1)ulimit -n 102400

    这只是在当前终端有效,退出之后,open files又变为默认值。

    2)将ulimit -n 102400写到/etc/profile中,这样每次登录终端时,都会自动执行/etc/profile。

    3)令修改open files的数值永久生效,则必须修改配置文件:/etc/security/limits.conf在这个文件后加上:

    * soft nofile 1024000
    * hard nofile 1024000
    root soft nofile 1024000
    root hard nofile 1024000
    

    参考链接:https://blog.csdn.net/tianlesoftware/article/details/6229521?utm_source=jiancool

    展开全文
  • 永久修改进程打开文件最大值限制自动化配置脚本,是linux服务器/阿里云新机器必修改选项,安装redis, kafka,elasticsearch等服务器必改
  • linux中ulimit作用

    2021-05-28 15:15:12
    linux中ulimit作用 一、作用 Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数。 ulimit主要是用来限制进程对资源的使用情况的,它支持各种类型的...

    linux中ulimit作用

    一、作用

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

     

    ulimit主要是用来限制进程对资源的使用情况的,它支持各种类型的限制,常用的有:
    
    内核文件的大小限制
    进程数据块的大小限制
    
    Shell进程创建文件大小限制
    
    可加锁内存大小限制
    
    常驻内存集的大小限制
    
    打开文件句柄数限制
    
    分配堆栈的最大大小限制
    
    CPU占用时间限制用户最大可用的进程数限制
    
    Shell进程所能使用的最大虚拟内存限制

     

     

    有个疑问:服务器资源是有限制的,limits.conf会限制资源,但是对于ulimit来说限制是粒度是哪些?  

    1)用户 ? 进程? 

    2)如果是进程的限制,系统中会有多个进程,那所有的进程同时需要受限于用户或整个系统的资源限制。

     

     

    二、用法

    ulimit使用的基本格式为:ulimit [options] [limit]

    具体的options参数含义如下表所示:

     

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

     

     其中ulimit -n用于限制进程能够打开的文件描述符的最大数目。因为任何设备在linux下都是文件,通信的接口也有专门的接口文件负责,所以linux下进程tcp链接的最大并发量也受限于该值。

     

    [root@centos5 ~]# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    max nice                        (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 4096
    max locked memory       (kbytes, -l) 32
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    max rt priority                 (-r) 0
    stack size              (kbytes, -s) 10240
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 4096
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited||<

    其中 "open files (-n) 1024 "是Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量,可影响MySQL的并发连接数目)。

    这个值可用ulimit 命令来修改,但ulimit命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效.

     

    有时候为了方便起见,也可以将用户资源的限制统一由一个文件来配置,这个文件就是/etc/security/limits.conf,该文件不但能对指定用户的资源进行限制,还能对指定组的资源进行限制。该文件的使用规则如下:

     <domain> <type> <item> <value> 

    其中:

    domain表示用户或者组的名字,还可以使用 * 作为通配符,表示任何用户或用户组。

    Type 表示限制的类型,可以有两个值,soft 和 hard,分别表示软、硬资源限制。软限制是指限制用户同时打开的文件数目,硬限制是指系统根据硬件资源(主要指内存)计算出来的最多可打开的文件数目。通常软限制低于硬限制;建议不要将软限制和硬限制修改过大。

    item 表示需要限定的资源名称,常用的有nofile、cpu、stack等。分别表示最大打开句柄数、占用的cpu时间、最大的堆栈大小。

    value 表示限制各种资源的具体数值。

    除了limits.conf文件之外,还有一个/etc/security/limits.d目录,可以将资源限制创建一个文件放到这个目录中,默认系统会首先去读取这个目录下的所有文件,然后才去读取limits.conf文件。所有资源限制设置完成后,退出shell终端,再次登录shell终端后,ulimit设置即可自动生效。

     注意:各种配置的生效方式。 

     

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

    ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024

    其他建议设置成无限制(unlimited)的一些重要设置是:
    数据段长度:ulimit -d unlimited
    最大内存大小:ulimit -m unlimited
    堆栈大小:ulimit -s unlimited
    CPU 时间:ulimit -t unlimited
    虚拟内存:ulimit -v unlimited

     

     

    配置生效方式

        暂时地,适用于通过 ulimit 命令登录 shell 会话期间。
        永久地,通过将一个相应的 ulimit 语句添加到由登录 shell 读取的文件中, 即特定于 shell 的用户资源文件,如:
    1)、解除 Linux 系统的最大进程数和最大文件打开数限制:
            vi /etc/security/limits.conf
            # 添加如下的行
            * soft noproc 11000
            * hard noproc 11000
            * soft nofile 4100
            * hard nofile 4100
          说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数
    2)、让 SSH 接受 Login 程式的登入,方便在 ssh 客户端查看 ulimit -a 资源限制:
            a、vi /etc/ssh/sshd_config
                把 UserLogin 的值改为 yes,并把 # 注释去掉
            b、重启 sshd 服务:
                  /etc/init.d/sshd restart
    3)、修改所有 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 使其生效

     

    在使用ulimit时,有以下几种使用方法:

    (1)在用户环境变量中加入

    如果用户使用的是bash,那么就可以在用户目录的环境变量文件.bashrc或者.bash_profile中加入“ulimit -u 128”来限制用户最多可以使用128个进程。

    (2)在应用程序的启动脚本中加入

    如果应用程序是tomcat,那么就可以在tomcat的启动脚本startup.sh脚本中加入“ulimit -n 65535”来限制用户最多可以使用65535个文件描述符。

    (3)直接在shell命令终端执行ulimit命令

    这种方法的资源限制仅仅在执行命令的终端生效,退出或者关闭终端后,设置失效,并且这个设置不影响其它shell终端。

     

    公司服务器需要调整 ulimit的stack size 参数调整为unlimited 无限,使用ulimit -s unlimited时只能在当时的shell见效,重开一个shell就失效了。。于是得在/etc/profile 的最后面添加ulimit -s unlimited 就可以了,source /etc/profile使修改文件生效。


    如果碰到类似的错误提示ulimit: max user processes: cannot modify limit: 不允许的操作 ulimit: open files: cannot modify limit: 不允许的操作
    为啥root用户是可以的?普通用户又会遇到这样的问题?
    看一下/etc/security/limits.conf大概就会明白。
    linux对用户有默认的ulimit限制,而这个文件可以配置用户的硬配置和软配置,硬配置是个上限。超出上限的修改就会出“不允许的操作”这样的错误。
    在limits.conf加上
    *        soft    noproc 10240
    *        hard    noproc 10240
    *        soft    nofile 10240
    *        hard    nofile 10240
    就是限制了任意用户的最大进程数和文件数为10240。

     

    如何设置普通用户的ulimit值

    1、vim /etc/profile

    增加 ulimit -n 10240

    source /etc/profile 重新启动就不需要运行这个命令了。

    2、修改/etc/security/limits.conf

    增加

    *      hard     nofile     10240   

    \\限制打开文件数10240

    3、测试,新建普通用户,切换到普通用户使用ulit -a 查看是否修改成功。

     

    查看系统级别资源限制:

    1.系统级别:

    sysctl -a (-a:显示当前所有可用的值)

    系统总限制:cat /proc/sys/fs/file-max 等一系列值,修改/etc/sysctl.conf 中也可以控制

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

     

    修改此硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:

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

    这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为800037。

    这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)800037个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。该值是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。

     

    查找文件句柄问题的时候,lsof可以很方便看到某个进程开了那些句柄.也可以看到某个文件/目录被什么进程占用了.

     

    2.session 设置:

    ulimit -a # 查看所有的 

    ulimit -S -n1024 #设置当前会话的打开文件数软连接数为 1024.

    ulimit -H -n1024 #设置当前会话的打开文件数硬连接数为 1024.

    ulimit -n 996 #设置当前会话的打开文件数硬&&软连接数都为 1024.

     

    3.设置用户(只针对用户的每个进程):

    #<domain> <type> <item> <value>

    #

    * soft nofile 32768

    * hard nofile 65536

     

    ulimit -n vs. file-max ? 
    简单的说, ulimit -n控制进程级别能够打开的文件句柄的数量, 而max-file表示系统级别的能够打开的文件句柄的数量。

    ulimit -n的设置在重启机器后会丢失,因此需要修改limits.conf的限制,limits.conf中有两个值soft和hard,soft代表只警告,hard代表真正的限制

    Cat /etc/security/limits.conf

    *               soft    nofile          150000  
    *               hard    nofile          150000  

    这里我们把soft和hard设置成一样的。

    “cat /proc/sys/fs/file-max”,或“sysctl -a | grep fs.file-max”查看系统能打开的最大文件数。查看和设置例如:

     

    [root@vm014601 ~]# sysctl -a |grep fs.file-max  
    fs.file-max = 200592  
    [root@vm014601 ~]# echo "fs.file-max = 2005920" >> /etc/sysctl.conf   
    [root@vm014601 ~]# sysctl -p  
    [root@vm014601 ~]# cat /proc/sys/fs/file-max                          
    2005920

     

    file-nr是只读文件,第一个数代表了目前分配的文件句柄数;第二个数代表了系统分配的最大文件句柄数;比如线上系统查看结果:

     

    # cat /proc/sys/fs/file-max  
    1106537  
    # cat /proc/sys/fs/file-nr       
    1088  0       1106537  
    # lsof | wc -l  
    1506

     

    可以看到file-nr和lsof的值不是很一致,但是数量级一致。为什么会不一致?原因如下: 

    写到lsof是列出系统所占用的资源,但是这些资源不一定会占用打开文件号的。如共享内存,信号量,消息队列,内存映射.等,虽然占用了这些资源,但不占用打开文件号.

    我曾经在前端机上很长时间都无法得到lsof | wc -l 的结果,这个时候可以通过file-nr粗略的估算一下打开的文件句柄数。

    展开全文
  • ulimit 命令详解

    千次阅读 2019-02-20 10:51:53
    可以用ulimit -a 来显示当前的各种用户进程限制。 下面我把某linux用户的最大进程数设为10000个:  ulimit -u 10240  对于需要做许多 socket 连接并使它们处于打开状态的 Java 应用程序而言,  最好通过使用 ...
  • 概述系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit是我们在处理这些问题时,经常使用的一种简单手段。ulimit 是一种 linux 系统的内...
  • [转]linux的ulimit各种限制之深入分析

    千次阅读 2021-05-14 17:57:24
    一般可以通过ulimit命令或编辑/etc/security/limits.conf重新加载的方式使之生效通过ulimit比较直接,但只在当前的session有效,limits.conf中可以根据用户和限制项使用户在下次登录中生效.对于limits.conf的设定是...
  • ulimit命令

    2021-11-08 21:19:52
    如,ulimit -Hs 64;限制硬资源,线程栈大小为64K -S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。如,ulimit -Sn 32;限制软资源,32个文件描述符 -a 显示当前所有的limit信息。如,ulimit...
  • ubuntu 修改 ulimit

    2022-03-04 23:54:44
    linux 修改 ulimit系统版本查看 ulimit临时修改永久修改系统修改用户修改systemd 修改参考 系统版本 查看 ulimit 临时修改 永久修改 系统修改 用户修改 systemd 修改 参考 Ubuntu 永久修改 ulimit -n
  • ulimit 首先我们看下ulimit这个指令的位置 which ulimit 可以看到没有任何输出,这是因为ulimit是内置指令 man ulimit ubuntu ULIMIT(3) Linux Programmer's Manual ULIMIT(3) NAME ulimit - get and set
  • ulimit最详解

    千次阅读 2019-09-20 13:50:53
    这篇文章应该是网络上关于ulimit最全的介绍了,有扩展,有打破沙锅追到底。文章尽可能的保证正确性,参考了多篇国外获得多数赞同的文章。文章实际操作内容均在Ubuntu16.04上测试通过。 术语 释义 File ...
  • 系统性能一直是一个受关注的话题,如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作,ulimit是我们在处理这些问题时,经常使用的一种简单手段。ulimit是一种Linux系统的内键功能...
  • linux ulimit 调优

    千次阅读 2021-12-16 14:27:07
    #ulimit -n 1024 在应用程序开发过程中,比如向 server 发起连接的客户端超过 1024 个时,server 由于 1024 个最大的文件个数限制而出现打开文件失败,进而出现Too many open files 错误。 在linux中这些限制是分为...
  • ulimit用于控制shell程序的资源。此为内建命令。 使用help ulimit获得帮助资源。
  • ulimit -c unlimited

    2020-03-19 17:17:38
    ulimit -c unlimited ulimint -a 用来显示当前的各种用户进程限制 Linux对于每个用户,系统限制其最大进程数,为提高性能,可以根据设备资源情况, 设置个Linux用户的最大进程数,一些需要设置为无限制: 数据段...
  • Linux ulimit 参数

    2021-05-15 17:00:27
    ulimit 全称 User limits - 限制使用系统范围内资源。语法ulimit [-acdfHlmnpsStuv] [limit]参数-S 设置资源的软限制。-H 设置资源的硬限制。-a 列出当前所有资源的限制。-c 允许创建核心文件大小的最大值。-d 进程...
  • linux ulimit设置

    2019-10-23 08:20:31
    ulimit用于shell启动进程所占用的资源. 2,类别: shell内建命令 3,语法格式: ulimit [-acdfHlmnpsStvw] [size] 4,参数介绍: -H 设置硬件资源限制. -S 设置软件资源限制. -a 显示当前所有的资源限制. -c size:设置core...
  • Linux Ulimit

    2021-09-18 09:20:08
    Ulimit是一个可以设置或者汇报当前用户资源限制的命令。 它只能在允许使用shell进行控制的系统中使用。也就是说它已经被嵌入到shell当中了。 查看系统资源(限制) ulimit -a 系统资源分为软资源(-S)和硬...
  • Linux ulimit命令

    2022-04-25 09:35:25
    Linux ulimit命令 Linux ulimit命令用于控制shell程序的资源 ulimit为shell内建指令,可用来控制shell执行程序的资源 语法 ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>]...
  • The ulimit command in Linux is an extremely useful command for system admins who manage multi-user systems. 对于管理多用户系统的系统管理员,Linux中的ulimit命令是非常有用的命令。 They need to have ...
  • 个人总结:如何设置普通用户的ulimit值1、vim /etc/profile增加 ulimit -n 10240source /etc/profile 重新启动就不需要运行这个命令了。2、修改/etc/security/limits.conf增加* hard nofile 10240\\限制打开文件数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,808
精华内容 28,323
关键字:

ulimit