进程与资源管理
windows资源管理器
在运维的日常工作中,监视系统的运行状况是每天例行的工作,一个服务器的健康,从主要的几个资源使用率上,就可以得出结论,比如CPU使用率、内存使用率,磁盘使用率。
在 Windows 中我们可以很直观的使用"任务管理器"来进行进程管理,了解系统的运行状态
通常,使用"任务管理器"主要有 3 个目的:
利用"应用程序"和"进程"标签来査看系统中到底运行了哪些程序和进程;
利用"性能"和"用户"标签来判断服务器的健康状态;
在"应用程序"和"进程"标签中强制中止任务和进程;
查看windows的进程信息
查看内存使用率,内存是系统及其重要的一个资源,内存大小,基本上决定了你电脑能打开多少个应用程序,所以你想同时听课、写代码、学于超老师的linux课,做笔记,聊微信,这么多事,需要你的内存足够大,打得开这么多软件。否则就会出现,卡死,内存不足,无法运行软件
linux资源管理器
linux中对需要运维去管理、去查看的资源信息,如下
内存资源、使用率
free命令
磁盘资源、使用率
df
CPU资源、使用率
top
htop
glances
进程资源、使用率
ps
pstree
pidof
网络资源、使用率
Iftop
所有资源的整体查看命令
top
glances
htop
什么是进程
进程是正在执行的一个程序或命令,每个进程都是一个运行的实体,并占用一定的系统资源
程序是人使用计算机语言编写的可以实现特定目标或解决特定问题的代码集合
什么是进程,线程
进程,是资源单位(包工头)
线程,是工作单位(干活的工人)
什么是父亲进程,儿子进程
我们登录的xshell终端,是这样的流程
- 系统上运行了sshd服务
- 通过ssh客户端命令,都是去连接这个服务,产生的一堆子进程而已
理解linux的启动进程关系
理解你是如何登录了linux,以及后续的命令执行,进程关系
linux系统启动产生的 1号进程
↓
运行了sshd服务,xxx进程
↓
ssh远程连接,xxx进程
↓
/bin/bash 进程,xxx进程
↓
后续各种命令 ,xxx进程,命令1,命令2,命令3
# 打开3个ssh会话窗口,一个用于查看进程,2个用于 使用vim命令操作,用ps,查看他们的父子关系
1.1进程、程序的关系
1. 开发把代码写好了,打个压缩包给你,还未运行的时候,这就是个静态、程序源代码,程序是数据和指令的集合。
2. 当运维将开发的代码运行起来之后,就称之为进程(机器上一个在运行的程序)
3. 程序运行时,系统为了清晰的标记每一个进程,为其分配了PID、运行的用户、内存、CPU等使用情况。
1.2 进程fork概念
1.我们的操作系统都是一堆进程而已,系统运行时,就产生了0号进程,然后其他进程都是0号进程创建的子进程。
2.linux启动之后,第一个进程就是PID为0,然后通过0号进程fork()出其他的进程。
3.操作系统的运行,就是不断的创建进程、以及销毁进程。
1.3 孤儿进程
父进程挂掉后,子进程归1号进程所属,此时的父进程为1号,1号进程好比是孤儿院,专门处理孤儿进程的善后工作,因此孤儿进程不会对系统产生什么危害。
# 于超老师教你用python实现,孤儿进程。
[root@yuchao-linux01 ~]# cat guer.py
#coding:utf-8
import os
import sys
import time
pid = os.getpid()
ppid = os.getppid()
print 'im father: ', 'pid: ', pid, 'ppid: ', ppid
son_pid = os.fork()
print('now song_pid is: ',son_pid)
#执行pid=os.fork()则会生成一个子进程
#返回值pid有两种值:
# 如果返回的pid值为0,表示在子进程当中
# 如果返回的pid值>0,表示在父进程当中
if son_pid > 0:
print 'father going die...'
# 让老父亲,主动退出,挂掉
sys.exit(0)
# 保证主线程退出完毕
# 程序延迟了1秒,还在运行中,儿子进程还未挂,成了孤儿
time.sleep(2)5
print 'im child: ', os.getpid(),'now my father is: ', os.getppid()
查看孤儿进程
[root@yuchao-linux01 ~]# python guer.py
im father: pid: 1953 ppid: 1930
('now song_pid is: ', 1954)
father going die...
('now song_pid is: ', 0)
[root@yuchao-linux01 ~]# im child: 1954 now my father is: 1
[root@yuchao-linux01 ~]#
1.4 僵尸进程
子进程挂掉,父进程并不知道子进程挂掉,就无法回收子进程,一直在系统中占着,成了可怕的僵尸进程,会对系统产生危害。你可以通过ps命令找到它,并且它的状态是(Z,zombie僵尸进程)
如果系统中产生大量僵尸进程,占据了系统中大量可分配的资源,如进程id号,系统就无法再正确创建新进程,完成任务,导致系统无法使用的危害。
理解僵尸进程
验证僵尸进程的确存在
[root@yuchao-linux01 ~]# ps -ef|grep 2086 |grep -v grep
root 2086 2051 0 14:47 pts/1 00:00:00 python zombie.py
root 2087 2086 0 14:47 pts/1 00:00:00 [python] <defunct>
[root@yuchao-linux01 ~]# ps aux|grep Z |grep -v grep
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2087 0.0 0.0 0 0 pts/1 Z+ 14:47 0:00 [python] <defunct>
1.4.1解决僵尸进程
1. 可以主动kill 父亲进程pid
2. 如果程序会自动结束的话,比如time.sleep()时间到期,也会退出所有进程。优化代码,不要再写这种垃圾代码了,把unix高级编程,好好学学
二 进程管理命令
1、top查看 CPU使用情况
命令:top
作用:查看服务器的进程占用的资源(100%使用)
语法:# top (动态显示)
top操作快捷键
z::打开,关闭颜色
M(大写):表示将结果按照内存(MEM)从高到低进行降序排列;
m(小写):切换内存memmory的显示格式。
P(大写):,表示将结果按照CPU 使用率从高到低进行降序排列;
1 :当服务器拥有多个cpu 的时候可以使用“1”快捷键来切换是否展示显示各个cpu 的详细信息;
q:退出
系统整体信息:
①第一行
按下键盘字母上方的数字1,可以显示多核CPU状态
虚拟机的硬件信息,通过vmware设置
②第二行
③第三行
④第四行
内存使用率,若是觉得数字不够直观,按下小写m键,切换显示
⑤第五行
swap分区是一块特殊的硬盘空间==,当实际内存不够用的时候,操作系统会从磁盘中取出一部分暂时不用的数据,放在交换内存中,从而使当前的程序腾出更多的内存量。
Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况
2)具体进程信息
ps进程区域信息,字段解释
问:如果发现服务器的CPU何负载过大,怎么办?
执行top命令,按下P,查看CPU使用最多的进程是哪一个,它是干什么的这个任务,然后决定下一步的处理。
问题:如果发现内存空闲率很低,内存不够用了,怎么办
top命令,看下大写M,查看内存使用率排行,从高到低排列
1.1 htop命令
比top好用
#安装命令
[root@chaogelinux ~]# yum install htop -y
1.直接输入htop命令,进入画面,各项指标和top相似
2.调整htop风格
1. 进入htop
2. 按下F2(setup),进入设置,针对Meters,记录可以修改记录显示风格
3. 上下左右,移动,状态栏会发生变化(空格键,更改风格)
4. 按下回车键,可以选择添加表(meters)
5. F10保存
6. htop能够记忆用户的设置
3.搜索进程
按下f3,输入进程名字,即可找到进程
杀死进程
定位到想要杀死进程的哪一行,按下F9
选择发送给进程的信号,一般是15,正常中断进程
回车,进程就挂了
5.显示进程树,F5。
6.其他快捷键
M:按照内存使用百分比排序,对应MEM%列;
P:按照CPU使用百分比排序,对应CPU%列;
T:按照进程运行的时间排序,对应TIME+列;
K:隐藏内核线程;
H:隐藏用户线程;
#:快速定位光标到PID所指定的进程上。
/:搜索进程名
2、ps查看进程
命令:ps(process status 进程状态)
语法:ps [参数选项]
作用:主要是查看服务器的进程信息,并且是打印当前的运行状态快照,而不是实时的监控,只是某一时刻的系统进程信息。
2.1 ps参数
参数风格,请注意,参数的位置,存在先后关系,位置错误可能导致无法使用。
# UNIX风格,没有短横线
a # 显示所有终端、所有用户执行的进程
u # 以用户显示出进程详细信息
x # 显示操作系统所有进程信息
f # 显示进程树形结构
o # 格式化显示进程信息,指定如pid
k # 对进程属性排序,如k %mem ,正序排序 ,k -%mem 逆序
--sort,再进行排序,如 --sort %mem 根据内存使用率显示
linux标准参数用法
-e # 显示所有进程
-f # 显示进程详细
-p # 指定pid,显示其信息,如 ps -fp 2609
-C # 指定进程的名字查看,如ps -fC sshd
-U # 指定用户名,查看用户进程信息 ps -Uf yuchao01
ps -ef
[root@yuchao-linux01 ~]# ps -ef | head -1
UID PID PPID C STIME TTY TIME CMD
[root@yuchao-linux01 ~]# ps -ef |tail -5
root 3001 2 0 16:34 ? 00:00:00 [kworker/1:2]
root 3235 2 0 16:37 ? 00:00:00 [kworker/0:0]
jack01 3253 2629 0 16:37 pts/0 00:00:00 sleep 1
root 3254 2051 0 16:37 pts/1 00:00:00 ps -ef
root 3255 2051 0 16:37 pts/1 00:00:00 tail -5
场景:当运维小于在公司里,发现监控报警了,给自己的微信发了个通知,应用服务器CPU使用率超过85%,自己得抓紧看看是什么问题。
1.查看top,进行CPU使用率排行最高的进程信息
top
2.查看ps -ef命令,再grep过滤出,你想要的信息。
ps aux
组合命令,使用BSD语法显示进程信息
解释
USER:该进程属于的用户
PID:该进程号码
%CPU:进程占用CPU的资源比率
%MEM:该进程占用物理内存百分比
VSZ:进程使用的虚拟内存,单位Kbytes
RSS:该进程占用固定的内存量,单位Kbytes
TTY:该进程运行的终端位置
STAT:进程目前状态,可以man ps查看细节
R:正在运行中
S:终端睡眠中,可以被唤醒
D:不可中断睡眠
T:进程被暂停
Z:已停止,无法由父进程正常终止,变成了zombie僵尸进程
进程额外字符
+:前台进程,比如R+,程序运行在前台,一旦终止,程序结束,数据丢失。
I:多线程进程,如Sl表示程序是多线程
N:低优先级进程,如Sn表示优先级很低的进程
<:高优先级进程
s:进程领导者(含有子进程),如Ss表示父进程
L:锁定到内存中
START:进程启动时间
TIME:CPU运行时间
COMMAND:进程命令,名字带有[]表示内核态进程,没有[]表示是用户执行的进程
ps结合grep
grep取反
语法
grep -v 选项,取反
[root@yuchao-linux01 ~]# ps -ef|grep vim |grep -v grep
root 20313 19658 0 20:38 pts/0 00:00:00 vim chaoge666.txt
2.1 ps常用命令组合(重点)
参数风格,请注意,参数的位置,存在先后关系,位置错误可能导致无法使用。
# UNIX风格,没有短横线
a # 显示所有终端、所有用户执行的进程
u # 以用户显示出进程详细信息
x # 显示操作系统所有进程信息
f # 显示进程树形结构
o # 格式化显示进程信息,指定如pid
k # 对进程属性排序,如k %mem ,正序排序 ,k -%mem 逆序
--sort,再进行排序,如 --sort %mem 根据内存使用率显示
linux标准参数用法
-e # 显示所有进程
-f # 显示进程详细
-p # 指定pid,显示其信息,如 ps -fp 2609
-C # 指定进程的名字查看,如ps -fC sshd
-U # 指定用户名,查看用户进程信息 ps -Uf yuchao01
2.2 pstree命令 作用、以树状图,显示父进程和子进程的关系
pstree 选项 [pid|user]
-p 显示pid
-u 显示用户切换
-H pid 高亮显示进程(没什么用)
-a 显示程序的完整命令,以及进程层级关系
用法
需安装
[root@yuchao-linux01 ~]# yum install psmisc -y
查看指定pid,一号进程的所有父子进程(用户角度运行的进程)
[root@yuchao-linux01 ~]# pstree 1
查看指定用户,关于这个用户生成的父子进程关系
[root@yuchao-linux01 ~]# pstree jerry01
查看jerry01用户生成的所有进程,且显示进程pid
[root@yuchao-linux01 ~]# pstree -ap jerry01
显示进程树,以及对应进程的执行用户名
[root@yuchao-linux01 ~]# pstree -ua
2.3 pidof命令
pidof命令
指定进程名,显示出其pid
如显示出nginx进程号
[root@yuchao-linux01 ~]# pidof nginx
5491 5490 5489
2.4 lsof查看进程打开了什么文件
当我们需要检查网站服务器的nginx进程,以及nginx都打开了哪些文件,比如nginx记录的日志,写入到了什么文件里,lsof可以轻松帮你找到这些文件
常用参数
-c # 指定进程名,打开了哪些系统文件,如lsof -c nginx
-i # 显示符合条件的进程,如ipv[46][protocol][@host|addr][:service|port]
-p # 显示指定pid打开的文件
-u # 显示指定用户uid打开的文件,以及具体进程信息
+d # 显示文件夹下被打开的文件有哪些,如 lsof +d /var/log/nginx/
+D # 递归列出目录下哪些文件被进程打开
-n # 不显示主机名,直接显示ip
-P # 不显示端口名,直接显示端口号
-s # 列出文件大小
状态解释
[root@yuchao-linux01 log]# lsof +D /var/log/nginx/ | head -2
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 5489 root 2w REG 253,0 0 17579733 /var/log/nginx/error.log
名称
进程标识符id号
进程执行的用户主
文件描述符
文件类型 reg普通文本 DIR目录
NODE 索引节点(文件在磁盘上的标识)
NAME 进程打开文件的名字
2.4.1 生产经验案例(lsof文件误删恢复)
# 1.确保nginx在运行中,以及有日志数据
[root@yuchao-linux01 log]# tail -f /var/log/nginx/access.log
# 2. lsof查看关于该日志文件的进程
[root@yuchao-linux01 ~]# lsof |grep /var/log/nginx/access.log
nginx 5489 root 5w REG 253,0 1353 17579732 /var/log/nginx/access.log
nginx 5490 nginx 5w REG 253,0 1353 17579732 /var/log/nginx/access.log
nginx 5491 nginx 5w REG 253,0 1353 17579732 /var/log/nginx/access.log
tail 6112 root 3r REG 253,0 1353 17579732 /var/log/nginx/access.log
# 3.模拟误删除该文件(但是进程没有退出,该文件描述符还未被释放,还是可以恢复的)
[root@yuchao-linux01 ~]# rm -f /var/log/nginx/access.log
[root@yuchao-linux01 ~]# ll /var/log/nginx/access.log
ls: cannot access /var/log/nginx/access.log: No such file or directory
# 4.再次查看文件描述符(文件名多了一个deleted被删除的标记)
[root@yuchao-linux01 ~]# lsof |grep /var/log/nginx/access.log
nginx 5489 root 5w REG 253,0 1353 17579732 /var/log/nginx/access.log (deleted)
nginx 5490 nginx 5w REG 253,0 1353 17579732 /var/log/nginx/access.log (deleted)
nginx 5491 nginx 5w REG 253,0 1353 17579732 /var/log/nginx/access.log (deleted)
tail 6112 root 3r REG 253,0 1353 17579732 /var/log/nginx/access.log (deleted)
# 5.此时进入linux中一个管理所有进程的目录,/proc,找到对应的进程id目录(父亲进程id),进入其管理文件描述符的地方。
[root@yuchao-linux01 fd]# pwd
/proc/5489/fd
[root@yuchao-linux01 fd]# ll
total 0
lrwx------ 1 root root 64 Mar 20 19:14 0 -> /dev/null
lrwx------ 1 root root 64 Mar 20 19:14 1 -> /dev/null
lrwx------ 1 root root 64 Mar 20 19:14 10 -> socket:[75619]
l-wx------ 1 root root 64 Mar 20 19:14 2 -> /var/log/nginx/error.log
lrwx------ 1 root root 64 Mar 20 19:14 3 -> socket:[75616]
l-wx------ 1 root root 64 Mar 20 19:14 4 -> /var/log/nginx/error.log
l-wx------ 1 root root 64 Mar 20 19:14 5 -> /var/log/nginx/access.log (deleted)
lrwx------ 1 root root 64 Mar 20 19:14 6 -> socket:[76223]
lrwx------ 1 root root 64 Mar 20 19:14 7 -> socket:[76224]
lrwx------ 1 root root 64 Mar 20 19:14 8 -> socket:[75617]
lrwx------ 1 root root 64 Mar 20 19:14 9 -> socket:[75618]
# 6.我们看到的这个5软连接文件,就对应了刚才的access.log日志文件
[root@yuchao-linux01 fd]# cat 5
# 7.恢复此文件描述符的数据,到日志文件即可完成文件恢复
[root@yuchao-linux01 fd]# cat 5 > /var/log/nginx/access.log
3、kill关闭进程
常用信号解释
3.0.1 杀死进程的命令
Kill (结束指定pid的进程)
killall (根据进程名杀死)
pkill (根据进程名杀死)
3.1 kill用法
kill -1 pid # 进程重读配置文件
kill -15 pid # 进程优雅退出
kill -9 pid # 暴力干掉进程
4、killall、pkill关闭进程
- kill需要找到pid,然后再干掉进程
- pkill更省事了,直接根据进程名字干掉进程
- 注意pkill,kill可能会误杀,因为是根据进程名字匹配,如果进程包含了某名字,也会被杀掉,因此少用。
命令:killall
作用:通过程序的进程名来杀死一类进程
语法:# killall [信号] 进程名称
信号种类:和kill相同,这里不再重复
kill是终止单独一个进程
killall是根据进程名字,终止一类进程
补充:进程后台运行
程序运行可以有2种
前台运行
程序运行在当前的终端,所有的信息都输出到屏幕上,占用你的终端,你也无法继续使用
如果终端异常关闭,导致程序会自动退出
后台运行
不会占用你的终端,程序在系统后台跑着,你该干啥干啥,终端关了,程序也继续运行
后台运行命令
命令集合
command & # 未启动的command放入后台去运行
jobs # 查看后台进程列表
ctrl + z # 暂停进程
bg # 程序放入后台运行,和 & 一样
fg # 将后台任务放入前台执行
后台命令实战(实战经验)
1.命令直接放入后台运行,注意日志写入到黑洞文件
[root@yuchao-linux01 ~]# ping yuchaoit.cn > /dev/null &
[1] 1718
[root@yuchao-linux01 ~]#
2.查看后台任务列表
[root@yuchao-linux01 ~]# jobs
[1]+ Running ping yuchaoit.cn > /dev/null &
[root@yuchao-linux01 ~]#
3.可以将后台任务,放入前台执行,然后ctrl + z 再次暂停程序,放入后台
[root@yuchao-linux01 ~]# fg 1
ping yuchaoit.cn > /dev/null
^Z
[1]+ Stopped ping yuchaoit.cn > /dev/null
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#
的确发现了一个停止的程序
[root@yuchao-linux01 ~]# jobs
[1]+ Stopped ping yuchaoit.cn > /dev/null
[root@yuchao-linux01 ~]#
4.可以再次让程序运行起来,并且依然是运行在后台
[root@yuchao-linux01 ~]# bg 1
[1]+ ping yuchaoit.cn > /dev/null &
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]#
[root@yuchao-linux01 ~]# jobs
[1]+ Running ping yuchaoit.cn > /dev/null &
[root@yuchao-linux01 ~]#
5、nohup命令 终端意外断开连接,后台执行的命令不会断开
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行
nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下
如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out 文件中。
一般和 & 后台符,结合使用。
记住一个标准用法
no
nohup不加&符号(不好用)
nohup添加&符号(好用)
nohup 生产环境下的用法(重要)
[root@yuchao-tx-server ~]# nohup ping baidu.com > /tmp/nohup_ping.log 2>&1 &
[1] 31021
[root@yuchao-tx-server ~]# jobs
[1]+ 运行中 nohup ping baidu.com > /tmp/nohup_ping.log 2>&1 &
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# tail -f /tmp/nohup_ping.log
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=50 time=5.50 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=50 time=5.52 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=50 time=5.45 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=50 time=5.50 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=5 ttl=50 time=5.50 ms
关闭窗口,程序也不会中断,只有通过ps命令可以看到该进程,还在运行了。
6、理解linux的数据流
执行linux命令时,linux默认为用户进程提供了3种数据流
stdin
标准输入、0
一般是键盘输入数据
比如cat命令等待用户输入
stdout
标准输出、1
程序执行结果,输出到终端
stderr 2
标准错误输出
程序执行结果,输出到终端
6.1 标准输入
cat 接收键盘的输入数据,然后打印到终端,直到ctrl +d 结束输入
[root@yuchao-tx-server ~]# cat
hello
hello
我爱你
我爱你
6.2 标准输出
[root@yuchao-linux01 ~]# ls /opt/
HelloWorld.class HelloWorld.java jdk jdk1.8.0_221 jdk-8u221-linux-x64.tar.gz passwd
6.3 标准错误输出
[root@yuchao-linux01 ~]# ls /opppp > stderr.txt
ls: cannot access /opppp: No such file or directory
6.4 数据重定向
我们发现,数据流的输入、输出,都是直接显示在屏幕上,然后你貌似做不了更多处理,不够强大。
因此linux系统提供了数据重定向符号,让你能够对数据再次做处理。
6.4.1 输入重定向
输入重定向是指把命令(或可执行程序)的标准输入,重定向到指定的文件中。
也就是说,输入可以不来自键盘,而来自一个指定的文件。
比如依然是是cat命令,原本应该是,等待键盘输入数据
现在是通过输入重定向符号,将标准输入stdin,改为了文件数据作为输入。
[root@yuchao-linux01 ~]# cat < t1.log
于超老师带你学Linux
666
666
6.4.2 输出重定向(重要)
输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。
这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。
使用 “ > ”符号,将标准输出重定向到文件中。形式为:命令>文件名
使用“ >> ”符号,将标准输出结果追加到指定文件后面。形式为:命令>>文件名
使用“ 2> ”符号,将标准错误输出重定向到文件中。形式为:命令 2> 文件名
使用“ 2>> ”符号,将标准错误输出追加到指定文件后面。形式为:命令 2>>文件名
使用“ 2>&1 ”符号或“ &> ”符号,将把标准错误输出stderr重定向到标准输出stdout
使用“ >/dev/null ”符号,将命令执行结果重定向到空设备中,也就是不显示任何信息。
重定向基本用法
[root@yuchao-tx-server ~]# echo '超哥带你学linux' > test.log
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# echo '超哥带你学linux' >> test.log
错误重定向追加
[root@yuchao-tx-server ~]# echhhho '超哥带你学linux' 2>> test.log
[root@yuchao-tx-server ~]#
[root@yuchao-tx-server ~]# cat test.log
超哥带你学linux
超哥带你学linux
-bash: echhhho: 未找到命令
将stderr重定向到stdout,就可以防止程序运行出错,导致程序异常
写法1
[root@yuchao-tx-server ~]# echhhho '超哥带你学linux' &>> test.log
写法2
[root@yuchao-tx-server ~]# echhhho '超哥带你学linux' >> test.log 2>&1
黑洞文件,空设备文件,也同样遵循,stdout、stderr的语法
[root@yuchao-tx-server ~]# echo '超哥带你学linux' &>> /dev/null
[root@yuchao-tx-server ~]# echhhhho '超哥带你学linux' &>> /dev/null
2>&1 解释
图解stdout/stderr
标准输出stdout就是一个命令会有正确的执行结果,在屏幕上显示出,让用户看见。
三、机器负载查看
3.1 系统平均负载查看uptime
系统负载指的是在单位时间内,系统分配给CPU处理的进程数量,必然是数量越多,负载值越高,机器的压力越大。
uptime命令
[root@yuchao-linux01 ~]# uptime
17:45:12 up 2:13, 2 users, load average: 0.00, 0.01, 0.05
这个load average表示平均负载,多少数值比较合适?
1.最理想化的状态是每个CPU都在运行着进程,充分让cpu工作起来,效率最大化,你得先看看你机器上有几个CPU(几个核,就是有几个cpu可以工作)。
# 发现是4核的
[root@yuchao-linux01 ~]# lscpu |grep -i '^cpu(s)'
CPU(s): 4
# 以及用top命令,按下数字1,查看几核。
top
2. 如何理解uptime看到的负载
分别是1、5、15分钟内的平均负载情况,表示是1~15分钟内CPU的负载变化情况。
1. 三个值如果差不多,表示系统很稳定的运行中,15分钟以内,CPU都没有很忙
2. 如果1分钟内的值,远大于15分钟的值,表示机器在1分钟内压力在直线上升
3. 如果1分钟内的值,小于15分钟的值,表示系统的负载正在下降中
3.2 CPU压力测试(硬核讲解)
3.2.1 sysstat工具包
sysstat是一个软件包,包含监测系统性能及效率的一组工具,这些工具对于我们收集系统性能数据,比如:CPU 使用率、硬盘和网络吞吐数据,这些数据的收集和分析,有利于我们判断系统是否正常运行,是提高系统运行效率、安全运行服务器的得力助手。
包含的工具
iostat
输出CPU的统计信息和所有I/O设备的输入输出(I/O)统计信息
mpstat
mpstat是Multiprocessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。mpstat最大的特点是:可以查看多核心cpu中每个计算核心的统计数据;而类似工具vmstat只能查看系统整体cpu情况。
pidstat
关于运行中的进程/任务、CPU、内存等的统计信息
sar
保存并输出不同系统资源(CPU、内存、IO、网络、内核等)的详细信息
sadc
系统活动数据收集器,用于收集sar工具的后端数据
sa1
系统收集并存储sadc数据文件的二进制数据,与sadc工具配合使用
sa2
配合sar工具使用,产生每日的摘要报告
sadf
用于以不同的数据格式(CVS或者XML)来格式化sar工具的输出
sysstat
sysstat 工具包的 man 帮助页面。
nfsiostat
NFS(Network File System)的I/O统计信息
cifsiostat
CIFS(Common Internet File System)的统计信息
官方网站: http://sebastien.godard.pagesperso-orange.fr
1.安装该工具包
[root@yuchao-linux01 ~]# yum install sysstat stress -y
2.对cpu压测,stress命令
# -c, --cpu N 产生 N 个进程,每个进程都反复不停的计算随机数的平方根
# -t, --timeout N 在 N 秒后结束程序
# 跑满2个cpu核,
[root@yuchao-linux01 ~]# stress --cpu 2 --timeout 600
stress: info: [3782] dispatching hogs: 2 cpu, 0 io, 0 vm, 0 hdd
3. 再开一个终端,查看机器的负载情况
一分钟内的CPU压力飙升
[root@yuchao-linux01 ~]# uptime
19:01:26 up 3:29, 2 users, load average: 1.35, 0.45, 0.19
4. 用watch命令,高亮检测哪些数值在变化
[root@yuchao-linux01 ~]# watch -d uptime
5.可以用mpstat命令查看cpu状态细节
-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
#查看多核CPU核心的当前运行状况信息, 每5秒更新一次
[root@yuchao-linux01 ~]# mpstat -P ALL 5
可以清晰的看到,哪一个cpu核,压力最大,通过%usr看到用户进程,消耗了100%的cpu。
6.也可以用top命令检测cpu压力,发现是有2个stress进程,占据了100%的cpu
top - 19:07:46 up 3:36, 2 users, load average: 1.33, 1.38, 0.74
Tasks: 131 total, 4 running, 127 sleeping, 0 stopped, 0 zombie
%Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7992344 total, 7450560 free, 139564 used, 402220 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 7573368 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3955 root 20 0 7312 100 0 R 100.0 0.0 0:10.55 stress
3954 root 20 0 7312 100 0 R 99.6 0.0 0:10.54 stress
1 root 20 0 125460 3896 2584 S 0.0 0.0 0:02.25 systemd
free查看内存使用情况
命令:free
作用:查看内存使用情况
语法:#free -m
选项:
-m 表示以mb为单位查看(1g = 1024mb,1mb = 1024kb)
-h 以可读形式显示容量,需要free -V显示版本大于3.3
free 命令主要是用来查看内存和 swap 分区的使用情况的,其中:
total:是指物理内存总大小,信息来自于/proc/meminfo
used:是指已经使用的内存,userd=total-free-buffers-cache
free:是指空闲的;free = total - used - buff - cache
shared:是指共享的内存;用于tmpfs系统
buff/cache
buffers:缓冲区,写入缓冲,用于内存和磁盘之间的数据写入缓冲,存放内存需要写入到磁盘的数据。
cached:缓存区,读取缓存,加快CPU和内存数据交换,存放内存已经读取完毕的数据。
8buff和cache
buffer,缓冲区,buffers是给写入数据加速的
Cache,缓存,Cached是给读取数据时加速的
总结cache、buffer
这俩都是计算机的重要属性,不仅在内存,磁盘里有使用,后面的网站架构篇,也多处使用到缓存的概念。
cache解决的时间问题,提高数据读取速度
cache利用的是内存极快的速度特性,读写速度是磁盘的很多倍。
buffer解决的是空间问题,给数据写入提供一个暂存空间
磁盘对碎片化的数据处理,是很低效的,我们后面学习磁盘管理,即可更深入理解
buffer利用的是内存的存储特性。
四、磁盘管理
df 查看磁盘信息
命令:df
作用:查看磁盘的空间(disk free)
语法:# df [-h]
选项:-h表示可读性较高的形式展示大小
4.1 磁盘io监控(iotop)
iotop命令 是一个用来监视磁盘I/O使用状况的top类工具。
iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息
1.安装iotop
[root@yuchao-linux01 ~]# yum install iotop -y
2.常用命令参数
-o:只显示有io操作的进程
-b:批量显示,无交互,主要用作记录到文件。
-n NUM:显示NUM次,主要用于非交互式模式。
-d SEC:间隔SEC秒显示一次。
-p PID:监控的进程pid。
-u USER:监控的进程用户。
-k 以kB单位显示读写数据信息
3.常用快捷键
左右箭头:改变排序方式,默认是按IO排序。
r:改变排序顺序。
o:只显示有IO输出的进程。
p:进程/线程的显示方式的切换,切换pid、tid
a:显示累积使用量
q:退出。
实践
1.显示默认信息
[root@yuchao-linux01 ~]# iotop
2.以kb单位显示io进程
[root@yuchao-linux01 ~]# iotop -k
五、网络管理
网络协议之TCP、UDP
5.3 netstat查看进程网络访问
命令:netstat
作用:查看网络连接状态
语法:netstat -tnlp
选项:
-t:表示只列出tcp 协议的连接;
-n:表示将地址从字母组合转化成ip 地址,将协议转化成端口号来显示;
-l :表示过滤出"state(状态)"列中其值为LISTEN(监听)的连接;
-p:表示显示发起连接的进程pid 和进程名称;
用法
1.linux允许一个服务,基本会打开一个端口,如sshd打开22端口,其他服务也一样用法,结合grep即可如果找不到对应信息,则得考虑是名字敲错了,还是服务未运行
[root@yuchao-linux01 ~]# netstat -tnlp |grep 22
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1810/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1156/sshd
tcp6 0 0 :::22 :::* LISTEN 1156/sshd
5.4 ss命令
ss 是类似netstat的工具。能显示查看网络状态信息,包括TCP、UDP连接,端口
并且性能远比netstat强悍,适合用于高并发服务器查看
-a 显示所有网络连接
-l 显示LISTEN状态的连接(连接打开)
-m 显示内存信息(用于tcp_diag)
-n, --numeric 不显示域名,直接显示ip地址
-o 显示Tcp 定时器x
-p 显示进程信息
-s 连接统计
-d 只显示 DCCP信息 (等同于 -A dccp)
-u 只显示udp信息 (等同于 -A udp)
-w 只显示 RAW信息 (等同于 -A raw)
-t 只显示tcp信息 (等同于 -A tcp)
-x 只显示Unix通讯信息 (等同于 -A unix)
-4 只显示 IPV4信息
-6 只显示 IPV6信息
--help 显示帮助信息
--version 显示版本信息
# 常用组合
# 显示tcp、udp、ip地址、监听中的连接、进程信息
[root@yuchao-linux01 ~]# ss -tunlp
5.5 网络流量监控命令iftop
作用和top和iotop一样,动态显示机器上,网卡的流量动态
[root@yuchao-linux01 ~]# yum install iftop -y
标签:linux01,log,0.0,yuchao,进程,root,资源管理
From: https://www.cnblogs.com/btcm409181423/p/17963911