[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > C/C++ > 正文
Unix編程/應用問答中文版 ---6./etc/system可調資源限制
本文出自:http://www.nsfocus.com 維護:小四 (2002-10-24 06:02:00)
6.    /etc/system可調資源限制 
6.1   Solaris下如何限制每個用戶可擁有的最大進程數 
6.2   如何配置系統使之支持更多的偽終端 
6.3   如何增加每個進程可打開文件句柄數 
6.4 
6.5   做了setuid()這類調用的程序如何產生core dump 
6.6   消息隊列調整 
-------------------------------------------------------------------------- 

6. /etc/system可調資源限制 

6.1 Solaris下如何限制每個用戶可擁有的最大進程數 

A: Casper Dik <Casper.Dik@Holland.Sun.Com> 

   在/etc/system設置 
   set maxuprc = <num> 

Q: maxusers參數究竟影響了什 

A: Casper Dik <Casper.Dik@Holland.Sun.Com> 

   下面以/etc/system語法格式舉例說明: 

   * 
   set maxusers = <以MB為單位計的可用物理內存數量> 

   * 系統所允許的最大進程數,通常最多30000 
   set max_nprocs = 10 + 16 * maxusers 

   * 每個用戶可以擁有的最大進程數(為超級用戶保留5個) 
   set maxuprc = max_nprocs - 5; 

   # sysdef | sed -n '/System Configuration/,$p' 

6.2 如何配置系統使之支持更多的偽終端 

A: Argoth 

不要試圖通過'/usr/bin/adb -k'到達目的。 

a. 如果Solaris版本小7,修改/etc/system,增加如下行 

   set pt_cnt=<num> 

   執行/usr/sbin/reboot -- -r,或者Stop-A,執行boot -r 

b. 對Solaris 8,支持的偽終端數目根據需要動態改變,系統依然有一個內部限制, 
   但是這個值非常大。如果"pt_cnt"變量小這個內部限制,將被忽略。一般情況 
   下,不再需要指定"pt_cnt"變量。但還是有某些罕見的情形,需要設置"pt_cnt" 
   變量大內部限制。 

6.3 如何增加每個進程可打開文件句柄數 

A: Casper Dik <Casper.Dik@Holland.Sun.COM> 

從Solaris 2.4開始,可以通過修改/etc/system實現 

    * set hard limit on file descriptors 
    set rlim_fd_max = 4096 
    * set soft limit on file descriptors 
    set rlim_fd_cur = 1024 

軟限制超過256時,某些應用程序會出問題,尤其BCP程序。軟限制超過1024時,那些 
使用select()的應用程序可能會出問題。Solaris 7之前,select()使用的文件句柄 
數不能超過1024。Solaris 2.6的RPC代碼被重寫過了,使用poll()代替select(),可 
以使用超過1024的文件句柄。Solaris 2.6之前,如果軟限制超過1024,所有RPC服務 
很可能崩潰。 

Solaris 7下select()可以使用最多達65536的文件句柄,64-bit應用程序缺省情況如 
此。如果是32-bit應用程序,需要指定給FD_SETSIZE一個更大的值,重新編譯。 

如果程序使用標準輸入/輸出(stdio),或者調用那些使用stdio的庫函數,當打開的 
文件超過256時,程序可能會出問題,這個限制是stdio的限制。當程序需要大量文件 
句柄時,應該想辦法保留一些小數字的文件句柄,讓stdio使用它們。 

Solaris 7下64-bit應用程序不再受這個stdio限制的影響。如果你的確需要超過256 
個FILE *,而又不能使用Solaris 7,或者需要運行32-bit代碼,考慮使用來自AT&T 
的SFIO(http://www.research.att.com/sw/tools/sfio/)。 

A: qaz@smth.org 

檢查當前設置 

# ulimit -H -n 
1024 
# ulimit -S -n 
64 


對Solaris,建議修改/etc/system重啟 

* set hard limit on file descriptors 
set rlim_fd_max=0x8000 
* set soft limit on file descriptors 
set rlim_fd_cur=0x8000 

然 ulimit -S -n 8192 

對Linux 

echo 65536 > /proc/sys/fs/file-max 

然 ulimit -S -n 8192 

對FreeBSD 

編輯/etc/sysctl.conf文件(或者sysctl -w,參看SYSCTL.CONF(5)) 
kern.maxfiles=65536 
kern.maxfilesperproc=32768 

Q: Linux下如何加大系統可以打開的文件數 

A: planck.bbs@bbs.nju.edu.cn 

echo <num> > /proc/sys/fs/file-max 

6.5 做了setuid()這類調用的程序如何產生core dump 

Q: 做了setuid()這類調用的程序不會產生core文件,可我需要調試這個程序。 

-------------------------------------------------------------------------- 
/* 
* gcc -Wall -O3 -o suidtest suidtest.c 
*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main ( int argc, char * argv[] ) 

    int *ptr = NULL; 

    printf( "Current uid = %d euid = %d\n", ( int )getuid(), ( int )geteuid() ); 
    printf( "Result of seteuid( 500 ) = %d\n", seteuid( 500 ) ); 
    printf( "Current uid = %d euid = %d\n", ( int )getuid(), ( int )geteuid() ); 
    creat( "/tmp/scz_blah", S_IRWXU ); 
    printf( "Result of setuid( 0 ) = %d\n", setuid( 0 ) ); 
    printf( "Current uid = %d euid = %d\n", ( int )getuid(), ( int )geteuid() ); 
    *ptr = 0; 
    return( EXIT_SUCCESS ); 
}  /* end of main */ 
-------------------------------------------------------------------------- 

# gcc -Wall -O3 -o suidtest suidtest.c 
# strip suidtest 
# file suidtest 
suidtest:       ELF 32-位 MSB 可執行 SPARC 版本 1,動態鏈接,除去 
# ls -l suidtest 
-rwxr-xr-x   1 root     other       4988  6月 29 21:21 suidtest* 
# ./suidtest 
Current uid = 0 euid = 0 
Result of seteuid( 500 ) = 0 
Current uid = 0 euid = 500 
Result of setuid( 0 ) = 0 
Current uid = 0 euid = 0 
段錯誤 
# ls -l core 
core: 無此文件或目錄 


這個程序應該core dump,但是現在沒有core文件產生。注意,此時suidtest僅僅是 
自己調用了setuid(),並非被"chmod u+s suidtest"過。有無/etc/system內核可配 
置參數改變這種行為。 

A: Sun Microsystems 2001-04-11 

出安全考慮,suid程序以及調用setuid()的程序缺省情況下不產生core dump。如 
果確實需要產生core dump以便進行調試,修改/etc/system文件並重啟系統 

* 缺省該值為0,此時禁止suid程序以及調用setuid()的程序core dump 
set allow_setid_core = 1 

對Solaris 2.6,需要先打補丁105181-22或更高版本,才能使用上述技術。對 
7及其更高版本的Solaris操作系統,不需要任何補丁。 

A: 小四 <scz@nsfocus.com> 2001-07-30 20:14 

對SPARC/Solaris 7來說,為了方便調試,執行coreadm -e proc-setid命令即可。 

6.6 消息隊列調整 

Q: 在/etc/system中如何調整消息隊列 

A: <solaris@sean.de> 

消息隊列統一使用 msgsys:msginfo_ 前綴。你可以用sysdef獲取一些缺省值,還可 
以參看/usr/include/sys/msg.h頭文件了解更多信息。此外不要忘記<<APUE>> 

msgsys:msginfo_msgmap 

    default 100 max 2147483647 <sys/msg.h> 100 

msgsys:msginfo_msgmax 

    default 2048 max 2147483647 <sys/msg.h> 8192 typical value 2048 

msgsys:msginfo_msgmnb 

    default 4096 max 2147483647 <sys/msg.h> 2048 typical value 4096 

msgsys:msginfo_msgmni 

    default 50 max 2147483647 <sys/msg.h> 50 typical value 50 

msgsys:msginfo_msgssz 

    default 8 max 2147483647 <sys/msg.h> 8 

msgsys:msginfo_msgtql 

    default 40 max 2147483647 <sys/msg.h> 50 typical value 40 

msgsys:msginfo_msgseg 

    default 1024 max 32767 <sys/msg.h> 1024 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Unix編程/應用問答中文版 ---5.塊設備相關問題 (2002-10-23 06:02:00)
Unix編程/應用問答中文版 ---4.系統資源相關問題 (2002-10-22 06:02:00)
Unix編程/應用問答中文版 ---3.-lelf、-lkvm、-lkstat相關問題 (2002-10-21 06:02:01)
Unix編程/應用問答中文版 ---2.堆棧相關問題 (2002-10-18 06:02:00)
Unix編程/應用問答中文版 ---1.系統管理配置問題 (2002-10-17 06:02:00)
Unix編程/應用問答中文版 ---0.簡介 Unix/C傳奇問題 (2002-10-16 06:02:01)
 

★  樊強制作 歡迎分享  ★