目录
进程监控
ps指令
查看父进程
终止进程
查看进程树
服务管理
service 指令
查看服务
运行级别
update-rc.d指令
systemctl指令
防火墙
动态监控进程
top指令
调度算法
top交互选项
监控网络状态
有以下选项
后缀 | 说明 |
-a | 查看所有终端信息 |
-u | 以用户形式显示所有进程信息 |
-x | 显示后台运行的参数 |
当然也可以不加任何参数,一般直接加 -aux,BSD 风格
格式为用户+进程id+cpu占用百分比+物理内存占用百分比+虚拟内存占用大小(kb)+实际内存占用大小(kb)+终端信息+运行状态+启动时间+占用的cpu时间+进程名字/启动该进程的指令
扔个运行状态表:
过滤直接利用管道grep
为什么要看这玩意儿呢,主要是为了方便对不同父进程及其子进程分类方便管理
ps -ef可以看到指令的父进程id,System V风格
后缀 | 说明 |
-e | 显示所有运行进程 |
-f | 全格式 |
格式为用户+进程id+父进程id+占用cpu百分比+启动时间+终端名称+占用cpu时间+进程的命令参数(更上面的差不多,就多了个父进程)
找个sshd服务相关进程
可以看到父进程是1号进程,0号进程是内核进程也就是启动的swapper,1号进程是启动的第一个进程,文件在usr/lib/systemd/systemd,主要有以下作用:
这里就是用到的作用4
Linux kill 命令用于删除执行中的程序或工作, 本意是给一个进程发送信号,默认不带参数就是发送信号15,也就是kill -15 pid.
众所周知,linux的信号列表前64个都是预定好的,扔个图
15的本意是软件终止信号,9才是真正的杀死信号,也可以理解为强制终止,有些进程是R状态,正在工作,你输入kill 其实纹丝不动,因为系统认为人家在上班你没办法开除人家,是误操作,如果要强制开除就-9
一般可以用来踢出登录用户,终止某些服务,或者终止僵尸程序
值得注意的是killall 这个指令用于终止父进程id以及其下面的所有子id
pstree
常用指令
后缀 | 作用 |
-p | 显示进程号 |
-u | 显示用户 |
简单举个例子,找我的进程有哪些:
加个p就有id了:
服务管理本质就是进程管理,只是在后台运行而已,然后会监听某个端口等待其他程序的请求,比如sshd,防火墙等,因此我们又称为守护进程,
使用指令为 service+服务名+start|stop|restart|reload|status |代表可选,具体作用就跟英文一样
我们可以去这个目录下看看哪些服务可以用service管理:
这只是一部分哈,具体的自己去看
我们随便选个看看状态比如ssh,具体的意思翻译成中文就懂了,不懂就去看计算机网络
值得注意的是这个逼,如果stop了所有链接都要报废,
如果想看所有的系统服务,service --status-all,这样就不用去文件夹里面看,直接这里看更方便
其中:[+] 代表服务是在启动运行的状态 [-] 代表服务是在关闭停止的状态
如果想看正在运行的就输入service --status-all | grep + ,具体的服务状态用上面的指令,很多英文那个
linux有7种运行级别,众所周知,常用的是3和5,需要用到init 1号进程进行切换
大概说一下:
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
输入runlevel可以看到运行级别
输入systemctel get-default查看默认具体的级别名称
也可以用systemtcl set-default设置默认级别,指令为systemtcl set-default + target文件名称
名称这里看
所有级别系统自动启动服务看看文件 /etc/rcS.d:
软链的名称有一定的规则:
S[number][service name] --> ../init.d/servicename
S 表示 Start,开启服务
[number]表示的是该脚本的运行优先级,number越小,脚本的运行优先级就越高
[service name]表示的是服务的名称。
因此我们如果需要定义一个服务启动的优先级(顺序),则需指定脚本的number即可。
然后什么级别就对应西面rc+numer.d文件,比如我们这里是5,那么除了启动rcS.d软连接对应的进程外还有
比如我们想修改系统自动启动时候的初始服务,那么我们就可以在对应级别下创建对应的软连接就行,但是比较麻烦,系统提供了一个指令update-rc.d命令可以快速创建。
格式为 update-rc.d
比如我们在运行级别为5的文件中加入我们希望自动启用的服务器,我们先去init.d看有没有,如果有就直输入 update-rc.d
快速删除指令为
sudo update-rc.d -f
使用方法为systemctl start|stop|restart|reload|status +服务名 当然还有其他指令(太多了),用法跟service 差不多,但是管理的服务对象跟service有区别,然后这都是临时的,reboot之后就没了
我们随便找个看看,显示的信息跟service一样的。
Ubuntu记得自己装个防火墙玩玩看,系统不会自动装
用这个指令管理的文件在这里:
可以用systemctl list-unit-files看服务开机启动状态
后面还可以跟其他关键字
关键字 | 描述 |
-enable | 使服务器开机自启 |
-disable | 关闭服务器开机自启 |
还可以用is-enabled看是否自动启动,跟那个update-rc.d差不多,比如防火墙
那我们到底用哪个呢,推荐大家用systemctl,这个能实现的功能比service更加全面而且好记
我们先看一下服务器对应的端口号 ,ip就不放出来了,只会显示传输层协议
上面是已经开启的端口号,比如22
然后比如说我们想打开端口号为111端口,需要输入以下指令
firewall-cmd --permanent --add-port=111/tcp,当然要超级用户啊
然后要记得reload,firewall-cmd --reload不然修改不起作用
我们再去看启动的服务器netstat -anp | head -20
发现并没有启动啊,因为我们只是开放了这个端口号而已啊,并不代表服务器启动出于监听状态了
但是我们可以查询这个端口的状态firewall-cmd --query-port=111/tcp
表明防火墙不会阻止外部往端口111的链接
关闭链接需要firewall-cmd --permanent --remove-port=111/tcp
记得reload
再查询看看,就变成no了
top跟ps指令比较类似,默认将按照 CPU 使用量的降序显示进程但是有个最大的不同,
默认将按照 CPU 使用量的降序显示进程top在执行一段时间可以动态的监控正在运行的内存。类似于win下的任务管理器。有几个常用的选项:
后缀 | 说明 |
-d + num | 刷新秒数,默认为3,不写就是3 |
-i | 不显示任何闲置或僵尸进程 |
-p | 通过指定id来监控某个进程的状态 |
更多的自己man看看。
写个top讲一下,格式跟ps差不多,
进程号+所属用户+动态优先级+静态优先级+虚拟内存占用大小+物理内存+共享内存大小+cpu占用比+内存占用比+内存占用时间+启动进程的指令
这里有必要讲一下优先级的概念,具体的优先级可以用chrt以及nice指令修改优先级,具体使用可以网上搜搜看,这里主要讲一下优先级的定义。
与优先级因子的不同,优先级定义得更加细致,内核中范围从1-139。其中nice定义为-20到19,然后一般对应的真实优先级为100-139,对应的pr值为0-39。大于100的都是非实时操作系统,小于100的都是rtos,比如上面的rt就是指小于100的。
简单来说,实时操作系统需要保证相关的实时进程在较短的时间内响应,不会有较长的延时,并且要求最小的中断延时和进程切换延时。
同样ps -l也可以看优先级,值得注意的是这里的pri跟上面的pr的关系,pri跟pr本质上是一个东西,只是加上了一个正数的一个换算而已。都是越小越优先
对于工业上低延迟相应的需求,一般的进程调度算法,无论是O1还是CFS都是无法满足的,所以内核在设计的时候,将实时进程单独映射了100个优先级,这些优先级都要高于正常进程的优先级(nice值),而实时进程的调度算法也不同,它们采用更简单的调度算法来减少调度开销。
对于实时进程可以用的调度策略是:SCHED_FIFO、SCHED_RR,
而对于非实时进程则是:SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。,俩other对应的策略不同一个是batch一个是others
我们输个chrt -p $$看看当前bash的优先级和调度算法: $$: 脚本执行的进程id;
发现这不是实时的
我们大概讲一下各个调度算法
实时进程调度策略:
再大概说一下非实时的调度算法:
而在这种情况下,如何支持优先级呢?
实际上就是将时间片分配成大小不等的若干种,优先级高的进程使用大的时间片,优先级小的进程使用小的时间片。这样在一个周期结速后,优先级大的进程就会占用更多的时间而因此得到特殊待遇。
值得注意的是,这种策略下,cpu会动态观察不同进程的占用cpu情况,然后不断调整pr的值,为±5区间,这也就是为什么这个东西叫动态优先级,而nice叫静态。
CFS完全公平调度:由于其对多核、多CPU系统的支持性能并不好,并且内核功能上要加入cgroup等因素,之后开始启用CFS作为对一般优先级(SCHED_OTHER)进程调度方法。
如果当前有n个进程需要调度执行,那么调度器应该在一个比较小的时间范围内,把这n个进程全都调度执行一遍,并且它们平分cpu时间,这样就可以做到所有进程的公平调度。
而在这种情况下,如何支持优先级呢?
当然,CFS中还需要支持优先级。在新的体系中,优先级是以时间消耗(vruntime增长)的快慢来决定的。
就是说,对于CFS来说,衡量的时间累积的绝对值都是一样纪录在vruntime中的,但是不同优先级的进程时间增长的比率是不同的,高优先级进程时间增长的慢,低优先级时间增长的快。
比如,优先级为19的进程,实际占用cpu为1秒,那么在vruntime中就记录1s。但是如果是-20优先级的进程,那么它很可能实际占CPU用10s,在vruntime中才会纪录1s。
举个CFS例子:如果有两个nice值为0的进程同时占用cpu,那么它们应该每人占50%的cpu,如果将其中一个进程的nice值调整为1的话,那么此时应保证优先级高的进程比低的多占用10%的cpu,就是nice值为0的占55%,nice值为1的占45%。那么它们占用cpu时间的比例为55:45。
多核如何支持完全公平?
对每个CPU核心都维护一个调度队列,这样每个CPU都对自己的队列进程调度即可。每个CPU一个队列,就可以避免对全局队列使用大内核锁,从而提高了并行效率。
当然,这样最直接的影响就是CPU之间的负载可能不均,为了维持CPU之间的负载均衡,CFS要定期对所有CPU进行load balance操作,于是就有可能发生进程在不同CPU的调度队列上切换的行为。
这种操作的过程也需要对相关的CPU队列进行锁操作,从而降低了多个运行队列带来的并行性。
不过总的来说,CFS的并行队列方式还是要比O1的全局队列方式要高效。尤其是在CPU核心越来越多的情况下,全局锁的效率下降显著增加。
常用的有以下几个选择:
操作 | 功能 |
P | cpu使用从小到大排,默认 |
M | 内存使用排序 |
N | 根据pid排序 |
q | 退出top |
这个不是带后缀啊,就是进入top之后哦输入这些会有反应。举个例子:
进入之后哦输入shift+M能看到按照内存排序,这里的内存是指实际物理内存的占用大小。
多次操作可以有以下选项:
输入 | 作用 |
u 然后用户名 | 监视指定用户 |
k 然后pid | 终止某个进程 |
比如说我监视我自己……?
需要用到一个很常用的指令netstat ,一般跟这些东西:
尾缀 | 作用 |
-an | 按一定顺序排列输出 |
-p | 显示哪个在调用 |
比如我加个p就有这个红框里面的东西,表示调用该网络服务的进程或者进程号,我这里全是因为没有开超级用户不让看
不然就是以下格式:协议+接收+接受缓存+输入缓存+本地ip及port+外部ip及port+链接状态
其中
recv-Q:网络接收队列
表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()
如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。
send-Q:网路发送队列
对方没有收到的数据或者说没有Ack的,还是本地缓冲区.
如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。
IP也分ipv6和ipv4,用:的都是ipv6,具体ipv6书写规则自己网上查
这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。