fork×××+限制单个用户可用虚拟内存和进程数
Linux   2009-12-03 15:44   阅读84   评论0   字号: 大大  中中  小小 实例脚本
脚本名: ulimit.sh
if [ $UID -ge 500 ]
then
ulimit -v 100000
ulimit -m 100000
ulimit -u 200
fi
注: ulimit -m和-v参数的单位为Kbytes. uid为500及500以上的用户都将自动修改ulimit数值(then后面的ulimit指令).
 
概念注释
·在Linux中,fork()和vfork() 是用于创建进程的两个函数。
·虚拟内存(virtual memory): ulimit -v 限制单个进程可用的虚拟内存大小, 其中虚拟内存包括所有的内存类型, 包括堆栈, 内存映射文件. ulimit -v 100000限制了单个进程最多能够使用100M内存, 超出该限制终端将会收到一个内存不足的错误.
·最大驻留集大小(maximum resident set size): ulimit -m 100000限制单个进程实际能驻留在RAM中的代码和数据大小不能超过100M.
·最大用户进程数(max user processes): ulimit -u 200限制当前用户同时不能超过拥有200个进程数.
 
实例操作一 进程fork×××
运行shell命令行, 运行下面指令:
[zhaoke@islab ~]$ ulimit -a
max memory size (kbytes, -m) unlimited
max user processes (-u) 4096       //这个限制不对root用户生效
virtual memory (kbytes, -v) unlimited
 [root@kk ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[root@kk ~]# :(){ :|:& };:
[1] 4831
 
[root@kk ~]# top
- 00:10:00 up 6 min,  2 users,  load average: 260.58, 931.39, 318.91 //哈哈,相当猛烈啊!!
Tasks: 7229 total, 7155 running,  73 sleeping,   0 stopped,   1 zombie
过几秒钟后系统停止任何服务.
(需强行reset系统)
 
补充说明:
定义一个循环调用自己的函数执行,你把函数名":"改成别的也一样
a() { a|a& }; a
a() { :|:& }; a

 
实例操作二 用ulimit.sh限制进程fork×××
1. 在/etc/profile.d目录下创建ulimit.sh脚本, 内容如上.
2. 打开shell终端, 然后再运行实例操作一中的第二步
[kk@kk root]$ ulimit -u 100
[kk@kk root]$ :(){ :|:& };:
[1] 4883
[kk@kk root]$ bash: fork: 资源暂时不可用
bash: fork: 资源暂时不可用
bash: fork: 资源暂时不可用
使用Ctrl-C终止fork×××进程.
 
task:Configuring the Linux Kernel Parameters 相关配置文件/etc/sysctl.conf
1, vi /etc/sysctl.conf 文件
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 4294967296   物理内存的一半(4096*1024*1024)
# semaphores: semmsl, semmns, semopm, semmnikernel.sem = 250 32000 100 128
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
#for oracle10G
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144
 
2, 运行命令使设置生效
# /sbin/sysctl –p

3,查看生效的配置
# sysctl -a
 
补充:
“:” 命令在激活变量替换时,非常有用!
例如:  :${LINES:=24} ${TERM:? “TERM not set”}
说明:  “:”是一个空操作,但是shell仍然计算它的参数。这样,若LINES 为空或未定义,它就被设为24 。 若TERM为空或未定义,那么整个脚本失败并发出出错消息”TERM not set”