Linux零碎記錄之ulimit【堆棧大小、stack size、進程數限制、檔案控制代碼限制、linux使用者空間限制】

來源:互聯網
上載者:User

寫了個小程式 本來打算寫個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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.