linux

最大进程数&最大线程数&ulimit命令

  1. Ulimit命令
    ulimit用于shell启动进程所占用的资源,可以用来设置系统的限制。
  2. 最大进程数
    可以使用cat /proc/sys/kernel/pid_max来查看操作系统最大可创建的进程和线程数值:
    可以使用ulimit –u 查看系统限制某用户最大可以运行多少线程max_user_process
    ulimit -u 65535

设置完以后,虽然我们设置户创建进程数的硬限制和软限制都是65535,但是我们还不能使用创建65535个进程。还需要设置内核参数kernel.pid_max,这个参数我默认安装都是32768,所以即使使用root帐户,却不设置这个内核参数,整个系统最多可以创建的进程数就是32768,所以我们需要进行如下设置:

sysctl -w kernel.pid_max=65535
3. 最大线程数
系统可生成最大线程数:
cat /proc/sys/kernel/threads-max
单进程可生成的最大线程数:
cat /proc/sys/vm/max_map_count

3.2.1. 查看
查看Linux实际运行的总线程数主要使用ps命令:

ps -eL | wc –l

具体参考:

http://3ms.huawei.com/km/blogs/membercenter/myblogs

接下来重点介绍怎么查看单个进程的线程数。

  1. 通过/proc伪文件系统。
    cat /proc/{pid}/status Threads后面的就是。

  2. top命令后面跟-H,会打印出所有线程列表。

top -H
top -Hp {pid}
手册中说:-H : Threads toggle
加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。

  1. ps 后面加上H,能打印某个进程的所有线程

ps hH p {pid} | wc –l
显示结果:
PID TTY STAT TIME COMMAND

17721 pts/1 Sl 0:00 /usr/java/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/mnt/deploy/apache-tomcat-8.0.35/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoader

17721 pts/1 Sl 0:00 /usr/java/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/mnt/deploy/apache-tomcat-8.0.35/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoader

17721 pts/1 Sl 0:00 /usr/java/jdk1.8.0_60/bin/java -Djava.util.logging.config.file=/mnt/deploy/apache-tomcat-8.0.35/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoader

使用ps命令来查看进程的时候,进程状态分别对应的含义如下:

D 不可中断睡眠 (通常是在IO操作) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
R 正在运行或可运行(在运行队列排队中)
S 可中断睡眠 (休眠中, 受阻, 在等待某个条件的形成或接受到信号)
T 已停止的 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行
W 正在换页(2.6.内核之前有效)
X 死进程 (未开启)
Z 僵尸进程 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放BSD风格的
< 高优先级(not nice to other users)
N 低优先级(nice to other users)
L 页面锁定在内存(实时和定制的IO)
s 一个信息头
l 多线程(使用 CLONE_THREAD,像NPTL的pthreads的那样)
+ 在前台进程组

  1. 使用pstree命令

// 打印所有进程及其线程

pstree -p

// 打印某个进程的线程数

pstree -p {pid} | wc –l

  1. 最大打开文件数
    4.1. 系统最大打开文件描述符数
    /proc/sys/fs/file-max中指定了系统范围内所有进程可打开的文件句柄的数量限制(系统级别, kernel-level).

当收到”Too many open files in system”这样的错误消息时, 就应该曾加这个值了。

对于2.2的内核, 还需要考虑inode-max, 一般inode-max设置为file-max的4倍. 对于2.4及以后的内核, 没有inode-max这个文件了。

4.1.1. 查看
可以使用cat /proc/sys/fs/file-max来查看当前系统中单进程可打开的文件描述符数目:

4.1.2. 设置
· 临时性

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

· 永久性:在/etc/sysctl.conf中设置

fs.file-max = 1000000

4.2. 单进程可最大可打开文件
nr_open:内核支持的最大file handle数量,即一个进程最多使用的file handle数。

4.2.1. 查看
cat /proc/sys/fs/nr_open

一般比较大,理论值。

查看实际值:
ulimit -n
当然默认查看的是软资源限制值soft limit,如果想要查看系统硬件所能支持的单进程最大打开文件描述符号的数目,可以使用ulimit –Hn:

4.2.2. 设置
临时性

通过ulimit -Sn设置最大打开文件描述符数的soft limit,注意soft limit不能大于hard limit(ulimit -Hn可查看hard limit)

另外ulimit -n默认查看的是soft limit,但是ulimit -n 1800000则是同时设置soft limit和hard limit。

对于非root用户只能设置比原来小的hard limit。

永久性
上面的方法只是临时性的,注销重新登录就失效了,而且不能增大hard limit,只能在hard limit范围内修改soft limit。

若要使修改永久有效,则需要在/etc/security/limits.conf中进行设置(需要root权限),可添加如下两行,表示用户chanon最大打开文件描述符数的soft limit为1800000,hard limit为2000000。以下设置需要注销之后重新登录才能生效:

chanon soft nofile 102400
chanon hard nofile 409600

linux常用shell命令(readlink,dirname,${#变量名[@]},basename,pushd,popd,dirs,wait,chroot)

dirname

文件所在的路径

${#变量名[@]}

表示数组的个数

# a=(1 2 3)
# echo ${#a[@]}
3

basename

用法示例:

 $ basename /usr/bin/sort       输出"sort"。
 $ basename ./include/stdio.h .h  输出"stdio"

为basename指定一个路径,basename命令会删掉所有的前缀包括最后一个slash(‘/’)字符,然后将字符串显示出来。

pushd

在多个目录之间切换
说明: pushd,popd,dirs这几个我们讲到的命令是bash内建的命令,所以只要登录到了bash,这几个命令就可以使用了

因为 cd -和 cd $OLDPWD都是只支持最近操作的两个目录,所以要在多个目录之间操作时,
我们需要使用 pushd

1.用到的3条命令pushd,popd,dirs

pushd:切换到作为参数的目录,并把原目录和当前目录压入到一个虚拟的堆栈中,如果不指定参数,则会回到前一个目录,并把堆栈中最近的两个目录作交换
popd: 弹出堆栈中最近的目录
dirs: 列出当前堆栈中保存的目录列表
看例子:

[root@localhost ~]# pushd /usr/local/sbin/
/usr/local/sbin ~
[root@localhost sbin]# dirs
/usr/local/sbin ~
[root@localhost sbin]# dirs -p -v
 0  /usr/local/sbin
 1  ~
[root@localhost sbin]# pushd /usr/share/kde4/apps/kget/
/usr/share/kde4/apps/kget /usr/local/sbin ~
[root@localhost kget]# dirs -p -v
 0  /usr/share/kde4/apps/kget
 1  /usr/local/sbin
 2  ~

说明: dirs的 -p参数可以每行一个目录的形式显示堆栈中的目录列表
-v参数可以在目录前加上编号
注意:有 -v时,不添加 -p也可以每行一个目录的形式显示
说明之二:我们可以看到:最近压入堆栈的目录位于最上面
2,如何在最近的两个目录之间切换?
在最近的两个目录之间切换:用pushd不加参数即可

 [root@localhost kget]# pushd /boot/grub/
   /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
   [root@localhost grub]# pushd
   /usr/share/kde4/apps/kget /boot/grub /usr/local/sbin ~
   [root@localhost kget]# dirs -v
   0  /usr/share/kde4/apps/kget
   1  /boot/grub
   2  /usr/local/sbin
   3  ~
   [root@localhost kget]# pushd
   /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
   /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
   [root@localhost grub]# pushd
   /usr/share/kde4/apps/kget /boot/grub /usr/local/sbin ~
   [root@localhost kget]# dirs -v
   0  /usr/share/kde4/apps/kget
   1  /boot/grub
   2  /usr/local/sbin
   3  ~
   [root@localhost kget]# pushd
   /boot/grub /usr/share/kde4/apps/kget /usr/local/sbin ~
   [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~

说明:可以看到,用pushd不加参数在最近的两个目录之间切换时,
当前目录总是位于堆栈的最上面
3,如何在多个目录之间切换?

用 pushd +n即可
说明:
n是一个数字,有此参数时,是切换到堆栈中的第n个目录,并把此目录以堆栈循环的方式推到堆栈的顶部
需要注意: 堆栈从第0个开始数起

看例子:

  [root@localhost grub]# dirs -v
   0  /boot/grub
   1  /usr/share/kde4/apps/kget
   2  /usr/local/sbin
   3  ~
   [root@localhost grub]# pushd +2
   /usr/local/sbin ~ /boot/grub /usr/share/kde4/apps/kget
   [root@localhost sbin]# dirs -v
   0  /usr/local/sbin
   1  ~
   2  /boot/grub
   3  /usr/share/kde4/apps/kget

4,如何把目录从堆栈中删除?
用popd即可

看例子:

 [root@localhost sbin]# dirs -v
 0  /usr/local/sbin
 1  ~
 2  /boot/grub
 3  /usr/share/kde4/apps/kget
 [root@localhost sbin]# popd
 ~ /boot/grub /usr/share/kde4/apps/kget
 [root@localhost ~]# dirs -v
 0  ~
 1  /boot/grub
 2  /usr/share/kde4/apps/kget

 [root@localhost ~]# popd +1
  ~ /usr/share/kde4/apps/kget
 [root@localhost ~]# dirs -v
 0  ~
 1  /usr/share/kde4/apps/kget

说明:可以看到popd不加参数的运行情况:
popd把堆栈顶端的目录从堆栈中删除,并切换于位于新的顶端的目录
说明之二: popd 加有参数 +n时,
n是堆栈中的第n个目录,表示把堆栈中第n个目录从堆栈中删除

1,pushd和popd都可以只影响堆栈而不切换目录
用 -n参数即可

看例子:

[root@localhost ~]# dirs -v
0  ~
1  /usr/share/kde4/apps/kget
[root@localhost ~]# pushd -n /boot/grub
~ /boot/grub /usr/share/kde4/apps/kget
[root@localhost ~]# dirs -v
 0  ~
 1  /boot/grub
 2  /usr/share/kde4/apps/kget

2.dirs可以清空目录堆栈用 -c参数即可

看例子:

 [root@localhost ~]# dirs -v
 0  ~
 1  /boot/grub
 2  /usr/share/kde4/apps/kget
 [root@localhost ~]# dirs -c
 [root@localhost ~]# dirs -v
 0  ~

说明: 位于堆栈顶部的目录是当前目录,它不能被pop出去的

wait

wait是用来阻塞当前进程的执行,直至指定的子进程执行结束后,才继续执行。使用wait可以在bash脚本“多进程”执行模式下,起到一些特殊控制的作用。

使用格式:
wait [进程号 或 作业号]
eg:wait 23 or wait %1
备注:
如果wait后面不带任何的进程号或作业号,那么wait会阻塞当前进程的执行,直至当前进程的所有子进程都执行结束后,才继续执行。
使用范例:

#!/bin/sh
echo “1”
sleep 5&
echo “3”
echo “4”
wait  #会等待wait所在bash上的所有子进程的执行结束,本例中就是sleep 5这句
echo”5”

chroot

增加了系统的安全性,限制了用户的权力:
在经过 chroot 之后,在新根下将访问不到旧系统的根目录结构和文件,这样就增强了系统的安全性。一般会在用户登录前应用 chroot,把用户的访问能力控制在一定的范围之内。

建立一个与原系统隔离的系统目录结构,方便用户的开发:
使用 chroot 后,系统读取的是新根下的目录和文件,这是一个与原系统根下文件不相关的目录结构。在这个新的环境中,可以用来测试软件的静态编译以及一些与系统不相关的独立开发。

切换系统的根目录位置,引导 Linux 系统启动以及急救系统等:
chroot 的作用就是切换系统的根位置,而这个作用最为明显的是在系统初始引导磁盘的处理过程中使用,从初始 RAM 磁盘 (initrd) 切换系统的根位置并执行真正的 init

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值