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

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

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中可以有213=81922 1 3=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详解

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值