Linux基础22 进程的优先级nice, 后台进程管理, 系统平均负载, 系统启动流程, 运行级别, 救援模式, 单用户模式(有root权限),并行运行
进程的优先级:
nice值越高:表示优先级越低,例如19,该进程容易将CPU使用量让给其他进程。
nice值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。
# 以设定的优先级启动 nice -n -10 tail -f /var/log/messages #重新设置一个进程的优先级(调整sshd的优先级) [root@oldboyedu ~]# renice -n -20 6684 (改完主进程变为-20,退出再登录sshd子进程也都变为-20) 6684 (process ID) old priority 0, new priority -20 6684 -20 /usr/sbin/sshd -D 9038 -20 sshd: root@pts/0 9067 -20 sshd: root@pts/1 注:java可能写了个进程,不断fork进程,占用文件描述符过多,导致oom,系统杀死线程后,进程fork出新的进程,达到死循环。
此时sshd很难连接上去,很多服务页面打不开,但是都是通的 可以通过把sshd优先级调到最高,保证sshd正常连接
#查看优先级
[root@ubuntu ~]# ps axo pid,cmd,nice
PID CMD NI
1 /sbin/init 0
2 [kthreadd] 0
...
16 [idle_inject/0] - #这里表示是内核进程,因为nice值最小是-20, 所以此处无法显示
[root@ubuntu ~]# top
centos优先级
系统优先级:0-139, 数字越小,优先级越高,各有140个运行队列和过期队列 实时优先级: 99-0 值最大优先级最高 nice值:-20到19,对应系统优先级100-139
- 优先级越高,并不代表程序执行会更快,而是说在cpu调度时,给予更高的权重,最先执行
- 优先级决定的是执行顺序靠前,而不决定其程序本身要执行多久
sshd连接不上的几种原因
1.网络 ping 10.0.0.100 2.端口 telnet 10.0.0.150 22 tcping 10.0.0.150 22 # 新买的阿里云会禁ping和telnet,可以用tcping测试 yum install -y tcping 3.用户 root 4.密码 1
nice:设置优先级
-n:指定优先级
nice -n -20 command
renice -n -5 pid
作业管理
- 前台作业:通过终端启动,且启动后一直占据终端
- 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
#让作业运行于后台 运行中的作业: Ctrl+z #使占据终端的进程暂停(变为stop状态T),让出终端 #后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。 尚未启动的作业: COMMAND & 退出后台,进程依然执行 退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系 nohup COMMAND &>/dev/null & screen;COMMAND tmux;COMMAND
后台进程管理:
jobs:查看后台进程 # 会显示当前后台所有进程 bg:永久放到后台执行(默认最后一个) #bg n 把jobs第n个任务放在后台永久执行,会话窗口会一直显示后台任务 fg:调出后台任务(默认最后一个) # fg n 会调出jobs中第n个任务
kill n #终止指定的作业
screen: (常用)# 后台进程管理, 可用于查看后台进程进度 -S:起名 -ls:查看后台进程的列表 -r:指定pid或者名字,进入后台进程 kill + pid 杀掉进程
在screen内,ctrl +d结束该screen进程 退出终端:ctrl +a +d(一直按住ctrl键,然后先按a,放开a,再按d) [root@oldboyedu ~]# yum install -y screen
操作举例(整套流程) [root@localhost ~]# screen # 创建终端 [root@localhost ~]# ping www.baidu.com ctrl +a +d # 退出终端,ping在后台运行(连按两次,会退出外层的终端(sshd)) [root@localhost ~]# screen -ls # 查看终端里任务pid There is a screen on: 113269.pts-0.localhost (Detached) 1 Socket in /var/run/screen/S-root. [root@localhost ~]# screen -r 113269 # 进入终端 [root@oldboyedu ~]# screen -ls # 查看终端 There is a screen on: 9461.pts-1.oldboyedu (Detached) 1 Socket in /var/run/screen/S-root. [root@oldboyedu ~]# screen -r 9461 # 进入该终端 [root@oldboyedu ~]# screen -S ping_baidu # 开一个终端,起个名 [detached from 9539.ping_baidu] [root@oldboyedu ~]# screen -ls There are screens on: 9539.ping_baidu (Detached) 9518.pts-1.oldboyedu (Detached) 9461.pts-1.oldboyedu (Detached) 3 Sockets in /var/run/screen/S-root. [root@oldboyedu ~]# screen -r ping_baidu # 进入终端 [detached from 9539.ping_baidu] [root@oldboyedu ~]# screen -r 9539 [detached from 9539.ping_baidu]
#注意:可以用pstree查看后台中进行的任务 #比如screen会话中执行了ping,并关闭会话窗口 #在另一个窗口连接查看任务,ping还在执行 root@ubuntu:~# pstree -p systemd(1)─┬─ModemManager(881)─┬─{ModemManager}(917) │ └─{ModemManager}(922) ... ├─screen(2381)───bash(2382)───ping(2389) #有个特殊操作,两个人同时进入同一个screen会话,那么无论谁做什么,另一个人都看得到
系统平均负载
cpu top上的load average 4 2 # 50%cpu没有合理利用到 2 2 # 100%cpu被用到 1 2 # 超负荷(一半的进程占用不到cpu)
企业中,一般当平均负载高于70%的时候,就需要排查负载高的问题了。
stress:是Linux系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。 [root@oldboyedu ~]# yum install -y stress mpstat:是多核CPU性能分析工具,用来实时检查每个CPU的性能指标,以及所有CPU的平均指标。 [root@oldboyedu ~]# yum install -y sysstat pidstat:是一个常用的进程性能分析工具,用来实时查看进程的CPU,内存,IO,以及上下文切换等性能指标。 [root@oldboyedu ~]# yum install -y sysstat
测试操作 stress --cpu 4 --timeout 600 # cpu压测 查看系统平均负债 watch -d uptime # watch 动态查看 -d高亮标出变化的内容 查看cpu使用情况(判断是否是cpu引起的问题) mpstat -P ALL 5 查看哪个进程导致cpu持续上升 pidstat -u 5 1 stress --io 1000 --timeout 600 # io压测 查看系统使用情况 mpstat -P ALL 5 #CPU不高,但是io升高会导致%sys系统内核态升高 查看哪个进程导致内核态持续上升 pidstat -u 5 1 注: io的升高并不会导致系统很卡 stress -c 4 --timeout 600 # 大量进程 查看系统使用情况 mpstat -P ALL 5 #CPU上升 iostat -d 10 # 查io
总结:
1.平均负载高有可能是CPU密集型进程导致的
2.平均负载高并不一定代表CPU的使用率就一定高,还有可能是I/O繁忙
3.当发现负载高时,可以使用mpstat、pidstat等工具,快速定位到,负载高的原因,从而做出处理
系统启动流程
开机启动流程CentOS6: 1.加电自检(BIOS)检查硬件 2.内核引导MBR 3.grub菜单 --->选择系统 4.加载内核 5.加载init # 运行级别(默认为3, 5为图形化界面)
6.初始化系统
7.启动开机自启动的服务(串行) 8.进入终端 开机启动流程CentOS7: 1.加电自检(BIOS)检查硬件 2.内核引导MBR 3.grub菜单 --->选择系统 4.加载内核 5.加载Systemd # 不再使用init, 改成systemd
6.读取运行级别
7.初始化系统
8.启动开机自启动的服务(并行) 9.进入终端
运行级别
0-6 0 关机 1 单用户 2 多用户 3 多用户 4 多用户(centos-6中没有使用) 5 图形化 6 重启 级别设置和获取 centos7中 设置 systemctl set-default 级别 查看 systemctl get-default centos6中 设置 init 查看 runlevel
单用户模式(有root权限)
1. 启动界面下,按e进入单用户模式
2.输入rd.break, 然后ctrl+x
3.挂载 mount -o rw,remount /sysroot/ (挂载这个目录才能获得root权限)
4.输入 chroot /sysroot/
5. exit
6.reboot
救援模式
Linux系统无法启动,且单用户模式也无法启动,需要进入救援模式。
1.开启虚拟机,鼠标点击控制台启动页面,同时迅速按下ESC键,一定要快,然后选择选项3,CD-ROM Drive启动
另一种vmware点打开电源进入固件,在虚拟机BIOS界面,将CD-ROM虚拟机调整为第一启动项,然后重新启动。
2.进入Troubleshooting
3.选择Rescue a CentOS system, 进入救援模式
4.输入1
5. 输入 chroot /mnt/sysimage获取root权限
6. 磁盘修复
grub2-install /dev/sda
7.exit
8.reboot
CentOS6:进入单用户
1.开机grub菜单,e,选择内核,再按e
2.quit 写1 或者single
3.回车,按 b
4.修改密码
5.修改运行级别
并行运行
利用后台执行,实现并行功能,即同时运行多个进程,提高效率
#方法1 [root@ubuntu ~]# cat all.sh f1.sh& f2.sh& f3.sh& wait #方法2 f1.sh&f2.sh&f3.sh& wait #最后加上wait,否则会一直卡着,不会退出 #多组命令实现并行 { ping -c3 127.1; ping 127.2; }& { ping -c3 127.3 ;ping -c3 127.4; }& #网段检测 #并发执行 #!/bin/bash net=172.16.1 for i in {1..254};do { ping -c1 -W1 $net.$i &> /dev/null && echo $net.$i is up || echo $net.$i is down }& done wait