發信人: dean (叮叮噹噹), 信區: LinuxDev
標 題: Unix編程/應用問答中文版 ---6./etc/system可調資源
發信站: 飄渺水雲間 (Fri Nov 22 12:02:19 2002), 轉信
Unix編程/應用問答中文版 ---6./etc/system可調資源限制
本文出自:[url]http://www.nsfocus.com[/url] 維護:小四
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
在/etc/system設定
set maxuprc =
Q: maxusers參數究竟影響了什麼
A: Casper Dik
下面以/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=
執行/usr/sbin/reboot -- -r,或者Stop-A,執行boot -r
b. 對於Solaris 8,支援的偽終端數目根據需要動態改變,系統依然有一個內部限制,
但是這個值非常大。如果"pt_cnt"變數小於這個內部限制,將被忽略。一般情況
下,不再需要指定"pt_cnt"變數。但還是有某些罕見的情形,需要設定"pt_cnt"
變數大於內部限制。
6.3 如何增加每個進程可開啟檔案控制代碼數
A: Casper Dik
從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([url]http://www.research.att.com/sw/tools/sfio/[/url])。
A: [email]qaz@smth.org[/email]
檢查當前設定
# 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: [email]planck.bbs@bbs.nju.edu.cn[/email]
echo > /proc/sys/fs/file-max
6.5 做了setuid()這類調用的程式如何產生core dump
Q: 做了setuid()這類調用的程式不會產生core檔案,可我需要調試這個程式。
--------------------------------------------------------------------------
/*
* gcc -Wall -O3 -o suidtest suidtest.c
*/
#include
#include
#include
#include
#include
#include
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: 小四 2001-07-30 20:14
對於SPARC/Solaris 7來說,為了方便調試,執行coreadm -e proc-setid命令即可。
6.6 訊息佇列調整
Q: 在/etc/system中如何調整訊息佇列
A:
訊息佇列統一使用 msgsys:msginfo_ 首碼。你可以用sysdef擷取一些預設值,還可
以參看/usr/include/sys/msg.h標頭檔瞭解更多資訊。此外不要忘記<>
msgsys:msginfo_msgmap
default 100 max 2147483647 100
msgsys:msginfo_msgmax
default 2048 max 2147483647 8192 typical value 2048
msgsys:msginfo_msgmnb
default 4096 max 2147483647 2048 typical value 4096
msgsys:msginfo_msgmni
default 50 max 2147483647 50 typical value 50
msgsys:msginfo_msgssz
default 8 max 2147483647 8
msgsys:msginfo_msgtql
default 40 max 2147483647 50 typical value 40
msgsys:msginfo_msgseg
default 1024 max 32767 1024