• Linux零碎记录之ulimit【堆栈大小、stack size、进程数限制、文件句柄限制、linux用户空间限制】


    写了个小程序 本来打算写个hash表的,但是出现“段错误”

    #include<stdio.h
    struct a{
    char a[4096];
    char a1[4096];
    char a2[4096];
    char a3[4096];
    };
    int main(){
    struct a b[1500];
    int i=0;
    for(;i<1500;i++)
    memset(b.a,oxff,4096);
    sleep(2000);
    }

    我就在纳闷,不就是分配点空间,怎么就不行了?

    后来知道,原来这是stack size 堆大小 达到最大后,就错误了。

    在Linux下,这个其实是可以设置的。

    使用 ulimit命令即可设置,不但可以设置这个,还可以设置其他很多限制,使用ulimit -a可以查看当前的设置。

    ayanmw@ayanmw-desktop:~/server_epoll$ ulimit -a
    core file size (blocks, -c) 0
    data seg size (kbytes, -d) unlimited
    scheduling priority (-e) 20
    file size (blocks, -f) unlimited
    pending signals (-i) 16382
    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) 4096
    cpu time (seconds, -t) unlimited
    max user processes (-u) unlimited
    virtual memory (kbytes, -v) unlimited
    file locks (-x) unlimited

    看到stack size居然是8192KB。

    程序一般是分为 堆 和 栈,堆 是存放变量名称的地方,比如指针一个指针 本身占用4个字节,指向一个32位地址(64位系统加倍),一般的变量比如int a,这里a的名称也是一个变量,指向存有值的a的空间地址。

    而栈就是放数据的地方,只要内存还有,就可以一直分配,不信你可以使用 一个指针,然后malloc(599999)的大小,进程占用内存就有几十MB了。

    可以看到,linux下还可以设置文件大小,打开的文件的数量限制。等等。

    ============================================

    以前发现普通用户无法修改ulimit,root用户 可以.

    百度搜索得到:

    /etc/security/limits.conf

    添加

    *               soft  nofile  8192
    *               hard    nofile  8192

    可以修改.

    CentOS 或 RedHat这个文件的路径貌似是:

    [oracle@qs-xezf-db2 ~]$ cat /etc/sysconfig/limits.conf

    oracle              soft    nproc   2047

    oracle              hard    nproc   16384

    oracle              soft    nofile  1024

    oracle              hard    nofile  65536

    修改文件应该就可以达到效果了.

    有人说:在/root/.bashrc中增加:
    ulimit -u unlimited
    ulimit -n 10240
    不一定管用.- -

    sysctl -a 可以查看更多系统配置信息.

    1、cat /proc/sys/fs/file-max,可以获得整个系统的文件句柄数目。一般是8192。如果希望增加句柄的总数,可以在脚本/etc/rc.d/rc..local中添加一行:echo 10240 >; /proc/sys/fs/file-max  (举例)

    不解:使用lsof -f|wc -l 可以看到当前系统的打开文件总数,我的一台邮件服务器在最疯狂的时候曾输出值为4万!!!就是说同时打开了(或未完全关闭)4万个文件链接。而file-max值为8192,为什么??

    2、通过设置/etc/security/limits.conf,实现控制每个进程的文件句柄数目。

    添加两行:   *      soft     nofile    1024
                      *      hard    nofile    8192

    确认/etc/pam.d/system-auth文件中有下面一行:session required /lib/security/pam_limits.so

    如果说每个进程能打开的文件句柄数目限制为8192,那该进程产生的线程所打开的文件句柄数目是限在该8192内?还是又一个8192呢?

    这个问题,最后采取了一个比较简单的方法:
    在/boot/.bashrc中加入:
    ulimit -u unlimited
    ulimit -n 20480

    然后所有普通用户的open files都变为20480了,用户最大进程数变为ulimited了。

    我看到有的地方说AS3要该进程数只能在
    1、设置fd_set支持的最大数量
     a、修改/usr/include/bits/typesizes.h 
      #define __FD_SETSIZE 1024 --->; 65536 
     b、修改/usr/src/linux/include/linux/posix_types.h  
      #define __FD_SETSIZE 1024 --->; 65536 

    2、修改/usr/src/linux/include/linux/fs.h 
      设置最大打开文件数量(TCP连接数量) 
      #define INR_OPEN 1024 --->; 65536 
      #define NR_FILE 8192 --->; 65536 
      #define NR_RESERVED_FILES 10 --->; 128 
    3、修改/usr/src/linux/include/net/tcp.h 
      a、设置TIMEOUT的时间为1秒 
      #define TCP_TIMEWAIT_LEN (60*HZ) 60 --->; 1*HZ 
      b、设置在backlog队列里的半连接的重试次数,每次都会花相应的时间,本质上也是减少重试时间 
      #define TCP_SYNACK_RETRIES 5 --->; 3 

    然后通过编译内核的方式来增加, 这样比ulimit 更直接修改内核参数.因为内核 是编译出来的.

    压力测试:

    yuan@yuan-desktop:~$ ab -n 30000 -c 5000 http://localhost/
    This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost [through 218.19.166.24:3129] (be patient)
    socket: Too many open files (24)
    提示出错 上网查到是socket系统默认为1024 大于该直就报错 修改.

    参考:http://www.chinaunix.net/jh/4/563088.html

    转载请注明出处:http://www.cnblogs.com/ayanmw 多谢

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

    一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。

  • 相关阅读:
    19-10-31-B
    19-10-30-Night-V
    19-10-30-C
    19-10-29-Night-X
    19-10-29-Z
    19-10-28-A
    19-10-27-S
    19-10-26-Night-D
    留言板
    优秀博客存档
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2371393.html
Copyright © 2020-2023  润新知