您的位置:首页-> 资讯中心-> .net技术-> .net-> Unix编程/应用问答中文版 ---6./etc/system可调资源限制

.net

.net

本类阅读TOP10

·C语言的lex和yacc工具说明
·C/C++语言中指向函数的指针
·C语言库函数(S类字母) - 3
·C语言库函数(I类字母)
·(新手篇)C++Builder 6操作MS SQL Server数据库的SQL集锦
·Unix编程/应用问答中文版 ---20.shell script问题
·Unix编程/应用问答中文版 ---8.Solaris内核编程相关问题
·jsp文件操作之读取篇
·C++Builder5.0调用SQLSERVER7.0驱动编程
·C++ Builder中,sql server在客户端调用存储过程向服务器端备份数据库

精品推荐
Unix编程/应用问答中文版 ---6./etc/system可调资源限制

加入时间:2005-2-22 快乐下载

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 




相关文章

相关软件