Linux 系統設置 ulimit 以及 Core文件的生成


查看限制情況 ulimit -a

可以看到如下信息

core file size           (blocks, -c) 0
data seg size            (kbytes, -d) unlimited
file size                (blocks, -f) unlimited
pending signals                  (-i) 1024
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
stack size               (kbytes, -s) 10240
cpu time                (seconds, -t) unlimited
max user processes               (-u) 4096
virtual memory           (kbytes, -v) unlimited
file locks                       (-x) unlimited

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

 

功能說明:控制shell程序的資源。

語  法:ulimit [-aHS][-c <core文件上限>][-d <數據節區大小>][-f <文件大小>][-m <內存大小>][-n <文件數目>][-p <緩衝區大小>][-s <堆疊大小>][-t <CPU時間>][-u <程序數目>][-v <虛擬內存大小>]

補充說明:ulimit爲shell內建指令,可用來控制shell執行程序的資源。

參  數:
    -a  顯示目前資源限制的設定。
    -c <core文件上限>  設定core文件的最大值,單位爲區塊。
    -d <數據節區大小>  程序數據節區的最大值,單位爲KB。
    -f <文件大小>  shell所能建立的最大文件,單位爲區塊。
    -H  設定資源的硬性限制,也就是管理員所設下的限制。
    -m <內存大小>  指定可使用內存的上限,單位爲KB。
    -n <文件數目>  指定同一時間最多可開啓的文件數。
    -p <緩衝區大小>  指定管道緩衝區的大小,單位512字節。
    -s <堆疊大小>  指定堆疊的上限,單位爲KB。
    -S  設定資源的彈性限制。
    -t <CPU時間>  指定CPU使用時間的上限,單位爲秒。
    -u <程序數目>  用戶最多可開啓的程序數目。
    -v <虛擬內存大小>  指定可使用的虛擬內存上限,單位爲KB。

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

 

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,簡單實例:

1]如果我們想要對由shell創建的文件大小作些限制,如:

CODE:

#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]把你要設置的ulimit放在/etc/profile這個環境文件中.


當系統中的一些程序在遇到一些錯誤以及crash時,系統會自動產生core文件記錄crash時刻系統信息,包括內存和寄存器信息,用以程序員日 後debug時可以使用。這些錯誤包括段錯誤、非法指令、總線錯誤或用戶自己生成的退出信息等等,一般地,core文件在當前文件夾中存放。

core文件有時可能在你發生錯誤時,並沒有出現在你當前的文件夾中,發生這種情況的原因有兩個:一個是當前終端被設置爲不能彈出core文件;另一種則是core文件被指定了路徑。

對於前者,我們可以使用ulimit命令對core文件的大小進行設定。一般默認情況下,core文件的大小被設置爲0,這樣系統就不dump出core文件了。這時,使用命令:ulimit -c unlimited進行設置,就可以把core文件的大小設置爲無限大,同時也可以使用數字來替代unlimited,對core文件的上限制做更精確的設定。(此方法暫時生效,退出失效)

除了可以設置core文件的大小之外,還可以對core文件的名稱進行一些規定。這種設置是對/proc/sys/kernel/core_pattern和/proc/sys/kernel/core_uses_pid這兩個文件進行修改。改動這兩個文件的方法如下:

echo <pattern> > /proc/sys/kernel/core_pattern

echo <"0"/"1"> /proc/sys/kernel/core_uses_pid

並且注意,只有超級用戶纔可以修改這兩個表。

core_pattern接受的是core文件名稱的pattern,它包含任何字符串,並且用%作爲轉移符號生成一些標示符,爲core文件名稱加入特殊含義。已定義的標示符有如下這些:

%%:相當於%

%p:相當於<pid>

%u:相當於<uid>

%g:相當於<gid>

%s:相當於導致dump的信號的數字

%t:相當於dump的時間

%e:相當於執行文件的名稱

%h:相當於hostname

除以上這些標誌位外,還規定:

1、末尾的單個%可以直接去除;

2、%加上除上述以外的任何字符,%和該字符都會被去除;

3、所有其他字符都作爲一般字符加入名稱中;

4、core文件的名稱最大值爲64個字節(包括'/0');

5、core_pattern中默認的pattern爲core;

6、爲了保持兼容性,通過設置core_uses_pid,可以在core文件的末尾加上%p;

7、pattern中可以包含路徑信息


1. 可以用ulimit -a 查看一下棧的大小。

在內核2.6.20下, stack size 爲8192 kbytes
如果這裏沒有限制,就棧的大小就只受內存的限制。2G是上限。

2. core 文件
     * 開啓或關閉core文件的生成
ulimit -c 可以查看是否打開此選項,若爲0則爲關閉;
ulimit -c 0可手動關閉
ulimit -c 1000 爲設置core文件大小最大爲1000k

ulimit -c unlimited 設置core文件大小爲不限制大小

 

很多系統在默認的情況下是關閉生成core文件的,這個命令可以加到你的profile中去

3.設置Core Dump的核心轉儲文件目錄和命名規則

 

在默認的情況下,很多系統的core文件是生成在你運行程序的目錄下,或者你在程序中chdir後的那個目錄,然後在core文件的後面加了一個 pid。在實際工作中,這樣可能會造成很多目錄下產生core文件,不便於管理,實際上,在2.6下,core文件的生成位置和文件名的命名都是可以配置 的。

 

/proc/sys/kernel/core_uses_pid可以控制產生的core文件的文件名中是否添加pid作爲擴展,如果添加則文件內容爲1,否則爲0
proc/sys/kernel/core_pattern可以設置格式化的core文件保存位置或文件名,比如原來文件內容是core-%e
可以這樣修改:
echo "/tmp/core-%e-%p" > core_pattern
將會控制所產生的core文件會存放到/corefile目錄下,產生的文件名爲core-命令名-pid-時間戳
以下是參數列表:
     %p - insert pid into filename 添加pid
     %u - insert current uid into filename 添加當前uid
     %g - insert current gid into filename 添加當前gid
     %s - insert signal that caused the coredump into the filename 添加導致產生core的信號
     %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間
     %h - insert hostname where the coredump happened into filename 添加主機名
     %e - insert coredumping executable name into filename 添加命令名

當然,你可以用下列方式來完成
sysctl -w kernel.core_pattern=/tmp/core-%e-%p

 

這些操作一旦計算機重啓,則會丟失,如果你想持久化這些操作,可以在 /etc/sysctl.conf文件中增加:
kernel.core_pattern=/tmp/core%p

 

加好後,如果你想不重啓看看效果的話,則用下面的命令:
sysctl -p /etc/sysctl.conf

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

高手指教:

     解決的問題:
            現有一程序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 多線程
           多線程如果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這種語句操作是忘記解鎖,還有嵌套鎖的問題,都需要分析清楚了。
                     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章