精华内容
下载资源
问答
  • 首先出现这个提示的原因:应用程序打开文件数量超过了系统设定值。 如何查看当前系统每个用户最大允许打开文件数量: [root@registry ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, ...

    首先出现这个提示的原因:应用程序打开的文件数量超过了系统设定值。

    如何查看当前系统每个用户最大允许打开文件数量:

    [root@registry ~]# 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) 3820
    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) 3820
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    

    或者

    [root@registry ~]# ulimit -n 
    1024  

    其中 open files (-n) 1024 表示每个用户最大允许打开的文件数量是1024

    #查看一下当前已有的连接数,以此来判断open files 为1024 是否足够

    [root@registry ~]# lsof -n  |awk '{print$2}'|sort |uniq -c |sort -nr |more
        590 5458
        445 1065
        306 638
        267 770
        190 5682
        189 5457
        158 704
        130 1194
        117 681
         81 1263
         68 5419
         66 640
         62 1
         60 5677
         57 678
         55 1067
         51 9036
         51 1196
         48 5698
         44 677
         44 470
         38 494
         32 637
         29 4430
         20 4614
         17 9250
         14 4566
         12 9256
         12 9251
         11 9254
         11 9252
         10 9255
         10 693
          9 9253
          3 92
          3 9037
          3 9033
          3 9
          3 8964
          3 8
          3 726
    

    其中第一列是打开的文件句柄数量,第二列是进程id号

    通过句柄数量最多的进程,查看是哪个应用程序打开了最多的文件句柄,通过命令:

    [root@registry ~]# ps -aef |grep PID
    

    设置open files 数值的方法

    1.临时设置方法

    [root@registry ~]# ulimit -n 4096
    [root@registry ~]# 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) 3820
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 4096
    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) 3820
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
    

    这样就可以把当前用户的最大允许打开文件数量设置为4096,但这种设置方法在重启后会还原为默认值。

    2.永久设置方法

    [root@registry ~]# vim /etc/security/limits.conf
    # End of file
    root soft nofile 65535
    root hard nofile 65535
    * soft nofile 65535
    * hard nofile 65535
    

    在文件末尾添加上述四行,其中后面两行的 * 表示所有的用户,也可以根据需要设置某一个用户,比如www

    # End of file
    root soft nofile 65535
    root hard nofile 65535
    www  soft nofile 65535
    www  hard nofile 65535
    

    注销账户,重新登录即可生效。 

    如果想查看某个进程最大允许打开的文件数量,可通过如下命令查看:

    [root@registry ~]# top 
    top - 15:39:21 up 101 days,  6:26,  1 user,  load average: 0.33, 0.57, 0.52
    Tasks:  70 total,   1 running,  69 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  6.7 us,  0.0 sy,  0.0 ni, 93.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
    KiB Mem :  3881824 total,   111956 free,  3505012 used,   264856 buff/cache
    KiB Swap:  2047996 total,  1001156 free,  1046840 used.   123968 avail Mem 
    
      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                 
    12872 www       20   0 2738092 743948   2292 S  6.7 19.2 652:05.43 java                                                                                                                    
        1 root      20   0   43380   2244   1352 S  0.0  0.1   4:11.26 systemd                                                                                                                 
        2 root      20   0       0      0      0 S  0.0  0.0   0:00.31 kthreadd                                                                                                                
        3 root      20   0       0      0      0 S  0.0  0.0  28:18.97 ksoftirqd/0                                                                                                             
        5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H                                                                                                            
        7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0                                                                                                             
        8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh                                                                                                                  
        9 root      20   0       0      0      0 S  0.0  0.0  33:52.08 rcu_sched                                                                                                               
       10 root      rt   0       0      0      0 S  0.0  0.0   0:39.61 watchdog/0                                                                                                              
       12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs                                                                                                               
       13 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns                                                                                                                   
       14 root      20   0       0      0      0 S  0.0  0.0   0:07.72 khungtaskd                                                                                                              
       15 root       0 -20       0      0      0 S  0.0  0.0   0:00.18 writeback                                                                                                               
       16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd                                                                                                             
       17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset                                                                                                                  
       18 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kblockd                                                                                                                 
       19 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 md                                                                                                                      
       25 root      20   0       0      0      0 S  0.0  0.0  12:21.57 kswapd0                                                                                                                 
       26 root      25   5       0      0      0 S  0.0  0.0   0:00.00 ksmd                                                                                                                    
       27 root      39  19       0      0      0 S  0.0  0.0   0:17.32 khugepaged                                                                                                              
       28 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 crypto                                                                                                                  
       36 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kthrotld                                                                                                                
       38 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kmpath_rdacd                                                                                                            
       39 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kpsmoused                                                                                                               
       40 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 ipv6_addrconf                                                                                                           
       59 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 deferwq                                                                                                                 
      101 root      20   0       0      0      0 S  0.0  0.0   0:03.48 kauditd                                                                                                                 
      225 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 ata_sff                                                                                                                 
      233 root      20   0       0      0      0 S  0.0  0.0   0:00.00 scsi_eh_0                                                                                                               
      234 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 scsi_tmf_0                                                                                                              
      235 root      20   0       0      0      0 S  0.0  0.0   0:00.00 scsi_eh_1                                                                                                               
      236 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 scsi_tmf_1                                                                                                              
      240 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 ttm_swap                                                                                                                
      252 root       0 -20       0      0      0 S  0.0  0.0   1:07.64 kworker/0:1H                                                                                                            
      257 root      20   0       0      0      0 S  0.0  0.0   3:12.26 jbd2/vda1-8                                                                                                             
      258 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 ext4-rsv-conver                                                                                                         
      325 root      20   0  119080   5460   5316 S  0.0  0.1   5:27.58 systemd-journal                                                                                                         
      354 root      20   0   44032      8      4 S  0.0  0.0   0:00.08 systemd-udevd                                                                                                           
    [root@registry ~]# cat /proc/12872/limits 
    Limit                     Soft Limit           Hard Limit           Units     
    Max cpu time              unlimited            unlimited            seconds   
    Max file size             unlimited            unlimited            bytes     
    Max data size             unlimited            unlimited            bytes     
    Max stack size            8388608              unlimited            bytes     
    Max core file size        0                    unlimited            bytes     
    Max resident set          unlimited            unlimited            bytes     
    Max processes             65535                65535                processes 
    Max open files            65535                65535                files     
    Max locked memory         65536                65536                bytes     
    Max address space         unlimited            unlimited            bytes     
    Max file locks            unlimited            unlimited            locks     
    Max pending signals       15089                15089                signals   
    Max msgqueue size         819200               819200               bytes     
    Max nice priority         0                    0                    
    Max realtime priority     0                    0                    
    Max realtime timeout      unlimited            unlimited            us  

    转载于:https://www.cnblogs.com/caoshousong/p/10774486.html

    展开全文
  • 本篇文章是对linux下进程的最大线程数、进程最大数、进程打开文件数进行了详细的分析介绍,需要的朋友参考下
  • inux下进程的最大线程数、进程最大数、进程打开文件数 2008-12-07 23:48 ========================= 如下转载自这里。linux 系统中单个进程的最大线程数有其最大的限制 ...
    inux下进程的最大线程数、进程最大数、进程打开的文件数
    2008-12-07 23:48


    =========================
        如下转载自这里


    linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX

    这个限制可以在 /usr/include/bits/local_lim.h 中查看

    对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源

    这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M

    可以写一段简单的代码验证最多可以创建多少个线程

                   int main()
                    {
                            int i = 0;
                            pthread_t thread;

                            while (1) {
                                if (pthread_create(&thread, NULL, foo, NULL) != 0)
                                    return;
                                i ++;
                                printf("i = %d\n", i);
                             }
                    }

    试验显示,在 linuxthreads 上最多可以创建 381 个线程,之后就会返回 EAGAIN

    在 nptl 上最多可以创建 382 个线程,之后就会返回 ENOMEM

    这个值和理论完全相符,因为 32 位 linux 下的进程用户空间是 3G 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是实际上代码段和数据段等还要占用一些空间,这个值应该向下取整到 383,再减去主线程,得到 382。

    那为什么 linuxthreads 上还要少一个线程呢?这可太对了,因为 linuxthreads 还需要一个管理线程

    为了突破内存的限制,可以有两种方法

    1) 用 ulimit -s 1024 减小默认的栈大小
    2) 调用 pthread_create 的时候用 pthread_attr_getstacksize 设置一个较小的栈大小

    要注意的是,即使这样的也无法突破 1024 个线程的硬限制,除非重新编译 C 库 <=此处值得讨论,我在ubuntu 7.04+3G内存上用ulimit -s 1024,则可以得到3054个线程。

    =======================进程最大数=================

        如下转载自这里,详细的可以参看这里

    LINUX中进程的最大理论数计算

    每个进程的局部段描述表LDT都作为一个独立的段而存在,在全局段描述表GDT中要有一个表项指向这个段的起始地址,并说明该段的长度以及其他一些 参数。除上之外,每个进程还有一个TSS结构(任务状态段)也是一样。所以,每个进程都要在全局段描述表GDT中占据两个表项。那么,GDT的容量有多大 呢?段寄存器中用作GDT表下标的位段宽度是13位,所以GDT中可以有8192个描述项。除一些系统的开销(例如GDT中的第2项和第3项分别用于内核 的代码段和数据段,第4项和第5项永远用于当前进程的代码段和数据段,第1项永远是0,等等)以外,尚有8180个表项可供使用,所以理论上系统中最大的 进程数量是4090。



    ===============重新编译内核来修改进程打开的最大文件数和修改listen侦听队列==========

        如下转载自这里

    用“ulimit -a”能看到这些限制,如: 
    [root@HQtest root]# ulimit -a 
    core file size (blocks, -c) 0 
    data seg size (kbytes, -d) unlimited 
    file size (blocks, -f) unlimited 
    max locked memory (kbytes, -l) unlimited 
    max memory size (kbytes, -m) unlimited 
    open files (-n) 1024 
    pipe size (512 bytes, -p) 8 
    stack size (kbytes, -s) 8192 
    cpu time (seconds, -t) unlimited 
    max user processes (-u) 2047 
    virtual memory (kbytes, -v) unlimited 
    用ulimit ?n 10240 修改打开的文件数目变为 10240 
    虽然使用ulimit ?a 能看到变为10240,不过我在做压力测试的时候,当超过1024个用户时,服务就会down机。 
    最后只有重新编译了内核,编译内核后一切OK! 
    操作方法如下: 
    不同的Linux内核版本有不同的调整方法, 
    在Linux内核2.2.x中能用如下命令修改: 

    # echo ’8192’ > /proc/sys/fs/file-max 
    # echo ’32768’ > /proc/sys/fs/inode-max 

    并将以上命令加到/etc/rc.c/rc.local文件中,以使系统每次重新启动时设置以上值。 

    在Linux内核2.4.x中需要修改原始码,然后重新编译内核才生效。编辑Linux内核原始码中的 include/linux/fs.h文件, 
    将 NR_FILE 由8192改为 65536,将NR_RESERVED_FILES 由10 改为 128。编辑fs/inode.c 文件将 MAX_INODE 由16384改为262144。 

    一般情况下,最大打开文件数比较合理的设置为每4M物理内存256,比如256M内存能设为16384, 
    而最大的使用的i节点的数目应该是最大打开文件数目的3倍到4倍。

    转载于:https://www.cnblogs.com/wshsdlau/p/3529036.html

    展开全文
  • linux下进程的最大线程数、进程最大数、进程打开文件数 ===========最大线程数==============linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX这个限制可以...

    linux下进程的最大线程数、进程最大数、进程打开的文件数

     

    ===========最大线程数==============

    linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX
    这个限制可以在 /usr/include/bits/local_lim.h 中查看
    对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源
    这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M
    可以写一段简单的代码验证最多可以创建多少个线程
     

    复制代码
    int main()
    {
    int i = 0;
    pthread_t thread;

    while (1) {
    if (pthread_create(&thread, NULL, foo, NULL) != 0)
    return;
    i ++;
    printf("i = %d\n", i);
    }
    }
    复制代码

    试验显示,在 linuxthreads 上最多可以创建 381 个线程,之后就会返回 EAGAIN
    在 nptl 上最多可以创建 382 个线程,之后就会返回 ENOMEM
    这个值和理论完全相符,因为 32 位 linux 下的进程用户空间是 3G 的大小,也就是 3072M,用 3072M 除以 8M 得 384,但是实际上代码段和数据段等还要占用一些空间,这个值应该向下取整到 383,再减去主线程,得到 382。
    那为什么 linuxthreads 上还要少一个线程呢?这可太对了,因为 linuxthreads 还需要一个管理线程
    为了突破内存的限制,可以有两种方法
    1) 用 ulimit -s 1024 减小默认的栈大小
    2) 调用 pthread_create 的时候用 pthread_attr_getstacksize 设置一个较小的栈大小
    要注意的是,即使这样的也无法突破 1024 个线程的硬限制,除非重新编译 C 库 <=此处值得讨论,我在ubuntu 7.04+3G内存上用ulimit -s 1024,则可以得到3054个线程。



    ===============进程最大数=================

    LINUX中进程的最大理论数计算:

    每个进程的局部段描述表LDT都作为一个独立的段而存在,在全局段描述表GDT中要有一个表项指向这个段的起始地址,并说明该段的长度以及其他一些 参数。除上之外,每个进程还有一个TSS结构(任务状态段)也是一样。所以,每个进程都要在全局段描述表GDT中占据两个表项。那么,GDT的容量有多大 呢?段寄存器中用作GDT表下标的位段宽度是13位,所以GDT中可以有8192个描述项。除一些系统的开销(例如GDT中的第2项和第3项分别用于内核 的代码段和数据段,第4项和第5项永远用于当前进程的代码段和数据段,第1项永远是0,等等)以外,尚有8180个表项可供使用,所以理论上系统中最大的 进程数量是4090。

     

    ===============重新编译内核来修改进程打开的最大文件数和修改listen侦听队列==========
    用“ulimit -a”能看到这些限制,如: 

    复制代码
    [root@HQtest root]# ulimit -a
    core file size (blocks, -c) 0
    data seg size (kbytes, -d) unlimited
    file size (blocks, -f) unlimited
    max locked memory (kbytes, -l) unlimited
    max memory size (kbytes, -m) unlimited
    open files (-n) 1024
    pipe size (512 bytes, -p) 8
    stack size (kbytes, -s) 8192
    cpu time (seconds, -t) unlimited
    max user processes (-u) 2047
    virtual memory (kbytes, -v) unlimited
    复制代码

    用ulimit ?n 10240 修改打开的文件数目变为 10240 
    虽然使用ulimit ?a 能看到变为10240,不过我在做压力测试的时候,当超过1024个用户时,服务就会down机。 
    最后只有重新编译了内核,编译内核后一切OK! 
    操作方法如下: 
    不同的Linux内核版本有不同的调整方法, 
    在Linux内核2.2.x中能用如下命令修改: 

    # echo ’8192’ > /proc/sys/fs/file-max
    # echo ’32768’ > /proc/sys/fs/inode-max

    并将以上命令加到/etc/rc.c/rc.local文件中,以使系统每次重新启动时设置以上值。 
    在Linux内核2.4.x中需要修改原始码,然后重新编译内核才生效。编辑Linux内核原始码中的 include/linux/fs.h文件,
    将 NR_FILE 由8192改为 65536,将NR_RESERVED_FILES 由10 改为 128。编辑fs/inode.c 文件将 MAX_INODE 由16384改为262144。 
    一般情况下,最大打开文件数比较合理的设置为每4M物理内存256,比如256M内存能设为16384, 
    而最大的使用的i节点的数目应该是最大打开文件数目的3倍到4倍。

     

    转自:http://hi.baidu.com/litto/blog/item/6185fbdddb1bc5e876c638a6.html

    转载于:https://www.cnblogs.com/soqu36/p/6992996.html

    展开全文
  • linux下进程的进程最大数 最大线程数 进程打开文件数和ulimit命令修改硬件资源限制
                         

    ulimit命令查看和更改系统限制


    ulimit命令详解


    ulimit用于shell启动进程所占用的资源,可以用来设置系统的限制

    语法格式

     

    ulimit [-acdfHlmnpsStvw] [size]

    /etc/security/limits.conf文件中定义
    限制。

                                                                                             
    命令参数描述例子
    -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;限制最大可加锁内存大小为 32 Kbytes
    -m最大内存大小,以 Kbytes 为单位ulimit – m unlimited;对最大内存不进行限制
    -n可以打开最大文件描述符的数量ulimit – n 128;限制最大可以使用 128 个文件描述符
    -p管道缓冲区的大小,以 Kbytes 为单位ulimit – p 512;限制管道缓冲区的大小为 512 Kbytes
    -s线程栈大小,以 Kbytes 为单位ulimit – s 512;限制线程栈的大小为 512 Kbytes
    -t最大的 CPU 占用时间,以秒为单位ulimit – t unlimited;对最大的 CPU 占用时间不进行限制
    -u用户最大可用的进程数ulimit – u 64;限制用户最多可以使用 64 个进程
    -v进程最大可用的虚拟内存,以 Kbytes 为单位ulimit – v 200000;限制最大可用的虚拟内存为 200000 Kbytes

    我们可以使用ulimit -a查看我们系统的所有限制

    ulimit -a

    当然我们都知道linux大部分的命令设置都是临时生效,而且ulimit命令只对当前终端生效

    如果需要永久生效的话,我们有两种方法,

    • 一种是将命令写至profile和bashrc中,相当于在登陆时自动动态修改限制

    • 还有一种就是在/etc/security/limits.conf中添加记录(需重启生效,并且在/etc/pam.d/中的seesion有使用到limit模块)。

    limits.conf文件附录


    在/etc/security/limits.conf修改限制的格式如下

     

    domino    type    item    value

                       
    参数描述
    domino是以符号@开头的用户名或组名,*表示所有用户
    type设置为hard or soft
    item指定想限制的资源。如cpu,core nproc or maxlogins
    value是相应的

    这里写图片描述

    最大进程数目


    LINUX中进程的最大理论数计算


    • 每个进程都要在全局段描述表GDT中占据两个表项

    每个进程的局部段描述表LDT都作为一个独立的段而存在,在全局段描述表GDT中要有一个表项指向这个段的起始地址,并说明该段的长度以及其他一些 参数。除上之外,每个进程还有一个TSS结构(任务状态段)也是一样。所以,每个进程都要在全局段描述表GDT中占据两个表项。

    • GDT的容量有多大呢?

    段寄存器中用作GDT表下标的位段宽度是13位,所以GDT中可以有2 1 3=8192 213=8192,当然这并没有什么卵用。

    再跟踪一下我们就会发现这个值其实是由内核参数nr_open定义的:

    cat /proc/sys/fs/nr_open 
    • 1

    这里写图片描述

    到此我们就要说起nr_open,与file-max了,网上在说到设置最大文件数时偶尔有些帖子也说到要修改file-max,字面上看file-max确实像是对应最大文件数,而在linux内核文档中它们两的解释是:

    • file-max:
      The value in file-max denotes the maximum number of file-
      handles that the Linux kernel will allocate. When you get lots
      of error messages about running out of file handles, you might
      want to increase this limit
     

    执行:grep -r MemTotal /proc/meminfo | awk ‘{printf(“%d”,$2/10)}’,可以看到与file-max是相近的;

    这里写图片描述

    • nr_open:
      This denotes the maximum number of file-handles a process can
      allocate. Default value is 1024*1024 (1048576) which should be
      enough for most machines. Actual limit depends on RLIMIT_NOFILE
      resource limit.

    file-handles(即文件句柄),然后相比而言在UNIX/LINUX中我们接触更多是file discriptor(FD,即文件描述符),似乎file-handle在windows中是一个类似file discrptor的东东,但是我们讨论的是linux,再google一下,我们可以精确到c语言中这两个概念的区别,

    据他们的讨论file-handle应该是一个高层的对象,使用fopen,fread等函数来调用,而FD是底层的一个对象,可以通过open,read等函数来调用。

    到此,我们应该可以下一个大致的结论了,file-max是内核可分配的最大文件数,nr_open是单个进程可分配的最大文件数,所以在我们使用ulimit或limits.conf来设置时,如果要超过默认的1048576值时需要先增大nr_open值(sysctl -w fs.nr_open=100000000或者直接写入sysctl.conf文件)。当然百万级别的单进程最大file-handle打开数应该也够用了吧。。

    1. 所有进程打开的文件描述符数不能超过/proc/sys/fs/file-max

    2. 单个进程打开的文件描述符数不能超过user limit中nofile的soft limit

    3. nofile的soft limit不能超过其hard limit

    4. nofile的hard limit不能超过/proc/sys/fs/nr_open

    其他


     

    如下内容转载自

       

    linux 单进程可创建最大线程数

    2.4内核与2.6内核的主要区别


    在2.4内核的典型系统上(AS3/RH9),线程是用轻量进程实现的,每个线程要占用一个进程ID,在服务器程序上,如果遇到高点击率访问,会造成进程表溢出,系统为了维护溢出的进程表,会有间歇的暂停服务现象,而2.6内核就不会发生由于大量线程的创建和销毁导致进程表溢出的问题

    线程结束必须释放线程堆栈


    就是说,线程函数必须调用pthread_exit()结束,否则直到主进程函数退出才释放,特别是2.6内核环境,线程创建速度飞快,一不小心立刻内存被吃光,这一点反倒是2.4内核环境好,因为2.4内核创建的是进程,而且线程创建速度比2.6内核慢几个数量级。特别提醒,在64位CPU,2.6内核创建线程的速度更加疯狂,要是太快的话,加上usleep ()暂停一点点时间比较好

    不要编需要锁的线程应用


    只有那些不需要互斥量的程序才能最大限度的利用线程编程带来的好处,否则只会更慢,2.6内核是抢占式内核,线程间共享冲突发生的几率远比2.4内核环境高,尤其要注意线程安全,否则就算是单CPU也会发生莫名其妙的内存不同步(CPU的高速缓存和主存内容不一致),Intel的新CPU为了性能使用NUMA架构,在线程编程中一定要注意扬长避短。

    单进程服务器最大并发线程数与内存


    很有趣,在默认的ulimit参数下,不修改内核头文件
    AS3 512M内存最多1000并发持续连接
    CentOS4.3 512M内存最多300并发持续连接
    似乎是CentOS不如AS3,这里主要原因是ulimit的配置造成,两个系统默认的配置差距很大,要想单进程维持更多线程接收并发连接,就要尽量缩小 ulimit -s的参数,插更多的内存条,单进程服务器上2000并发一点都不难,POSIX默认的限制是每进程64线程,但NTPL并非纯正POSIX,不必理会这个限制,2.6内核下真正的限制是内存条的插槽数目(也许还有买内存的钱数)
    最近几天的编程中,注意到在32位x86平台上2.6内核单进程创建最大线程数=VIRT上限/stack,与总内存数关系不大,32位x86系统默认的VIRT上限是3G(内存分配的3G+1G方式),默认 stack大小是10240K,因此单进程创建线程默认上限也就300(3072M / 10240K),用ulimit -s 修改stack到1024K则使上限升到大约3050。我手头没有64位系统,不知道2.6内核在64位上单进程创建线程上限(实际上是本人懒得在同事的机器上装fc4_x86_64)。
    前些天买了一套廉价的64位x86系统(64位赛杨+杂牌915主板),安装了CentOS4.3的x86_64版本,跑了一遍下面的小程序,得到的结果是:在ulimit -s 4096的情况下,单进程最大线程数在16000多一点,用top看
    VIRT 的上限是64G,也就是36位, cat /proc/cpuinfo的结果是:address sizes   : 36 bits physical, 48 bits virtual, 和我想象的标准64位系统不同, 我一直以为64位系统的内存空间也是64位的

    附注1


    单位里某BSD FANS用AMD64笔记本跑小程序测试线程创建速度(线程创建后立即phread_detach()然后紧跟着pthread_exit(),共计 100万个线程),同样源码OpenBSD竟然比FreeBSD快了3倍,什么时候OpenBSD也变得疯狂起来了?

    附注2


    测试单进程创建线程上限C源码(test.c)

    #include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>void * thread_null(void);int main(int argc, char *argv[]){    unsigned int    i;    int             rc;    pthread_t       pool_id[65536]; //线程ID    sleep(1);    //创建线程    for(i = 0; i < 65536; i++)    {        rc = pthread_create(pool_id + i, 0, (void *)thread_null, NULL);        if (rc != 0)        {            fprintf(stderr, "pthread_create() failure\r\nMax pthread num is %d\r\n", i);            exit(-1);        }    }    fprintf(stdout, "Max pthread num is 65536\r\nYour system is power_full\r\n");    exit(0);}void * thread_null(void){    pthread_detach(pthread_self());    sleep(60);    pthread_exit(NULL);}
    • 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
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
     

    参考

       

    linux参数之/proc/sys/fs详解

               
    展开全文
  • 进程最大打开文件描述符个数

    千次阅读 2019-05-06 23:26:31
    不过在看下节之前, 首先知道在本机下打开文件描述符个数的...临时最大进程最大打开文件描述符 通过查看一个进程的最多打开个数, ulimit -n 设置临时设置打开个数 : limit -n10001 在普通用户下最多能够临时打...
  • Linux最大进程数和文件最大打开

    千次阅读 2018-07-14 14:13:32
    Linux最大进程数和文件最大打开
  • 最近在检查nodejs websocket内存泄漏问题时候发现,打开文件数目过大有100多个,之前以为文件夹是磁盘文件打开,实际这个监控指标不仅仅是文件IO打开,而且还包含网络IO打开,比如socket连接也算。这个可以依靠linux...
  • 转自:...===========最大线程数============== linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX 这个限制可以在 /usr/include/bits/local_lim...
  • 本文利用Prlimit动态修改正在运行进程最大文件打开数。 本文以修改nginx最大文件打开数为例。 2、实践 # 当前系统最大文件打开数 [root@vm-CentOS750221 ~]# ulimit -a|grep open open files (-n) 2048 # 查看...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,991
精华内容 1,596
关键字:

进程打开大文件