Linux 进程监控与服务管理

目录

进程监控

ps指令

查看父进程

终止进程

查看进程树

​服务管理

service 指令

查看服务

运行级别

update-rc.d指令

systemctl指令

 防火墙

 动态监控进程

top指令

调度算法

top交互选项

监控网络状态


进程监控

ps指令

有以下选项

后缀       说明
-a 查看所有终端信息
-u 以用户形式显示所有进程信息
-x 显示后台运行的参数

当然也可以不加任何参数,一般直接加 -aux,BSD 风格

 格式为用户+进程id+cpu占用百分比+物理内存占用百分比+虚拟内存占用大小(kb)+实际内存占用大小(kb)+终端信息+运行状态+启动时间+占用的cpu时间+进程名字/启动该进程的指令

Linux 进程监控与服务管理_第1张图片

扔个运行状态表:

Linux 进程监控与服务管理_第2张图片

过滤直接利用管道grep

查看父进程

为什么要看这玩意儿呢,主要是为了方便对不同父进程及其子进程分类方便管理

ps -ef可以看到指令的父进程id,System V风格

后缀 说明
-e 显示所有运行进程
-f 全格式

格式为用户+进程id+父进程id+占用cpu百分比+启动时间+终端名称+占用cpu时间+进程的命令参数(更上面的差不多,就多了个父进程)

Linux 进程监控与服务管理_第3张图片

找个sshd服务相关进程

可以看到父进程是1号进程,0号进程是内核进程也就是启动的swapper,1号进程是启动的第一个进程,文件在usr/lib/systemd/systemd,主要有以下作用:

  1. 执行/etc/init.d中的所有脚本文件,启动系统服务
  2. 执行/sbin/getty初始化012三个io文件描述符
  3. 执行/bin/login 启动用户登录程序
  4. 管理孤儿进程

这里就是用到的作用4

终止进程

Linux kill 命令用于删除执行中的程序或工作, 本意是给一个进程发送信号,默认不带参数就是发送信号15,也就是kill -15 pid.

众所周知,linux的信号列表前64个都是预定好的,扔个图

Linux 进程监控与服务管理_第4张图片

15的本意是软件终止信号,9才是真正的杀死信号,也可以理解为强制终止,有些进程是R状态,正在工作,你输入kill 其实纹丝不动,因为系统认为人家在上班你没办法开除人家,是误操作,如果要强制开除就-9

一般可以用来踢出登录用户,终止某些服务,或者终止僵尸程序

值得注意的是killall 这个指令用于终止父进程id以及其下面的所有子id

查看进程树

 pstree 

常用指令

后缀 作用
-p 显示进程号
-u 显示用户

简单举个例子,找我的进程有哪些:

Linux 进程监控与服务管理_第5张图片

加个p就有id了:

Linux 进程监控与服务管理_第6张图片服务管理

service 指令

服务管理本质就是进程管理,只是在后台运行而已,然后会监听某个端口等待其他程序的请求,比如sshd,防火墙等,因此我们又称为守护进程,

使用指令为 service+服务名+start|stop|restart|reload|status  |代表可选,具体作用就跟英文一样

我们可以去这个目录下看看哪些服务可以用service管理:

Linux 进程监控与服务管理_第7张图片

这只是一部分哈,具体的自己去看

我们随便选个看看状态比如ssh,具体的意思翻译成中文就懂了,不懂就去看计算机网络

Linux 进程监控与服务管理_第8张图片

值得注意的是这个逼,如果stop了所有链接都要报废, 

 

查看服务

如果想看所有的系统服务,service --status-all,这样就不用去文件夹里面看,直接这里看更方便 

Linux 进程监控与服务管理_第9张图片

其中:[+] 代表服务是在启动运行的状态 [-] 代表服务是在关闭停止的状态

如果想看正在运行的就输入service --status-all | grep + ,具体的服务状态用上面的指令,很多英文那个

Linux 进程监控与服务管理_第10张图片

运行级别

 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文件名称

名称这里看

Linux 进程监控与服务管理_第11张图片

所有级别系统自动启动服务看看文件 /etc/rcS.d:

Linux 进程监控与服务管理_第12张图片

软链的名称有一定的规则:

       S[number][service name] --> ../init.d/servicename

S 表示 Start,开启服务

       [number]表示的是该脚本的运行优先级,number越小,脚本的运行优先级就越高

       [service name]表示的是服务的名称。

       因此我们如果需要定义一个服务启动的优先级(顺序),则需指定脚本的number即可。

 然后什么级别就对应西面rc+numer.d文件,比如我们这里是5,那么除了启动rcS.d软连接对应的进程外还有

Linux 进程监控与服务管理_第13张图片

update-rc.d指令

比如我们想修改系统自动启动时候的初始服务,那么我们就可以在对应级别下创建对应的软连接就行,但是比较麻烦,系统提供了一个指令update-rc.d命令可以快速创建。

格式为 update-rc.d  start|stop|

比如我们在运行级别为5的文件中加入我们希望自动启用的服务器,我们先去init.d看有没有,如果有就直输入 update-rc.d  start 99 5,这里就不演示了

快速删除指令为

       sudo update-rc.d -f remove

systemctl指令

使用方法为systemctl start|stop|restart|reload|status +服务名 当然还有其他指令(太多了),用法跟service 差不多,但是管理的服务对象跟service有区别,然后这都是临时的,reboot之后就没了

我们随便找个看看,显示的信息跟service一样的。 

Ubuntu记得自己装个防火墙玩玩看,系统不会自动装

Linux 进程监控与服务管理_第14张图片

用这个指令管理的文件在这里:

Linux 进程监控与服务管理_第15张图片

可以用systemctl list-unit-files看服务开机启动状态

Linux 进程监控与服务管理_第16张图片

后面还可以跟其他关键字

关键字      描述
-enable 使服务器开机自启
-disable 关闭服务器开机自启

 还可以用is-enabled看是否自动启动,跟那个update-rc.d差不多,比如防火墙

那我们到底用哪个呢,推荐大家用systemctl,这个能实现的功能比service更加全面而且好记

 防火墙

 我们先看一下服务器对应的端口号 ,ip就不放出来了,只会显示传输层协议

Linux 进程监控与服务管理_第17张图片

上面是已经开启的端口号,比如22

然后比如说我们想打开端口号为111端口,需要输入以下指令

firewall-cmd --permanent --add-port=111/tcp,当然要超级用户啊

然后要记得reload,firewall-cmd --reload不然修改不起作用

我们再去看启动的服务器netstat -anp | head -20

Linux 进程监控与服务管理_第18张图片

发现并没有启动啊,因为我们只是开放了这个端口号而已啊,并不代表服务器启动出于监听状态了

 但是我们可以查询这个端口的状态firewall-cmd --query-port=111/tcp

表明防火墙不会阻止外部往端口111的链接

关闭链接需要firewall-cmd --permanent --remove-port=111/tcp

 记得reload

 再查询看看,就变成no了

 动态监控进程

top指令

top跟ps指令比较类似,默认将按照 CPU 使用量的降序显示进程但是有个最大的不同,

默认将按照 CPU 使用量的降序显示进程top在执行一段时间可以动态的监控正在运行的内存。类似于win下的任务管理器。有几个常用的选项:

后缀 说明
-d + num 刷新秒数,默认为3,不写就是3
-i 不显示任何闲置或僵尸进程
-p 通过指定id来监控某个进程的状态

更多的自己man看看。

写个top讲一下,格式跟ps差不多,

进程号+所属用户+动态优先级+静态优先级+虚拟内存占用大小+物理内存+共享内存大小+cpu占用比+内存占用比+内存占用时间+启动进程的指令

Linux 进程监控与服务管理_第19张图片这里有必要讲一下优先级的概念,具体的优先级可以用chrt以及nice指令修改优先级,具体使用可以网上搜搜看,这里主要讲一下优先级的定义。

与优先级因子的不同,优先级定义得更加细致,内核中范围从1-139。其中nice定义为-20到19,然后一般对应的真实优先级为100-139,对应的pr值为0-39。大于100的都是非实时操作系统,小于100的都是rtos,比如上面的rt就是指小于100的。

简单来说,实时操作系统需要保证相关的实时进程在较短的时间内响应,不会有较长的延时,并且要求最小的中断延时和进程切换延时。

同样ps -l也可以看优先级,值得注意的是这里的pri跟上面的pr的关系,pri跟pr本质上是一个东西,只是加上了一个正数的一个换算而已。都是越小越优先

Linux 进程监控与服务管理_第20张图片

调度算法

对于工业上低延迟相应的需求,一般的进程调度算法,无论是O1还是CFS都是无法满足的,所以内核在设计的时候,将实时进程单独映射了100个优先级,这些优先级都要高于正常进程的优先级(nice值),而实时进程的调度算法也不同,它们采用更简单的调度算法来减少调度开销。

对于实时进程可以用的调度策略是:SCHED_FIFO、SCHED_RR,

而对于非实时进程则是:SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。,俩other对应的策略不同一个是batch一个是others

我们输个chrt -p $$看看当前bash的优先级和调度算法: $$:  脚本执行的进程id;

发现这不是实时的

我们大概讲一下各个调度算法

实时进程调度策略:

  1. SCHED_FIFO:以先进先出的队列方式进行调度,在优先级一样的情况下,谁先执行的就先调度谁,除非它退出或者主动释放CPU。
  2. SCHED_RR:以时间片轮转的方式对相同优先级的多个进程进行处理。时间片长度为100ms。

再大概说一下非实时的调度算法:

  1. 01算法:老版本的算法,已经逐渐被CFS取代,但是老服务器还是用这个算法 
    这个调度器的名字之所以叫做O1,主要是因为其算法的时间复杂度是O1。

    O1调度器仍然是根据经典的时间片分配的思路来进行整体设计的。时间片的思路就是将CPU的执行时间分成一小段一小段的,假如是5ms一段。于是多个进程如果要“同时”执行,实际上就是每个进程轮流占用5ms的cpu时间,而从1s的时间尺度上看,这些进程就是在“同时”执行的。
     

    而在这种情况下,如何支持优先级呢?

    实际上就是将时间片分配成大小不等的若干种,优先级高的进程使用大的时间片,优先级小的进程使用小的时间片。这样在一个周期结速后,优先级大的进程就会占用更多的时间而因此得到特殊待遇。

    值得注意的是,这种策略下,cpu会动态观察不同进程的占用cpu情况,然后不断调整pr的值,为±5区间,这也就是为什么这个东西叫动态优先级,而nice叫静态。

  2. 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核心越来越多的情况下,全局锁的效率下降显著增加。

top交互选项

常用的有以下几个选择:

操作 功能
P cpu使用从小到大排,默认
M 内存使用排序
N 根据pid排序
q 退出top

这个不是带后缀啊,就是进入top之后哦输入这些会有反应。举个例子:

Linux 进程监控与服务管理_第21张图片

进入之后哦输入shift+M能看到按照内存排序,这里的内存是指实际物理内存的占用大小。

多次操作可以有以下选项:

输入 作用
u 然后用户名 监视指定用户
k 然后pid 终止某个进程

比如说我监视我自己……?

Linux 进程监控与服务管理_第22张图片

监控网络状态

需要用到一个很常用的指令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情况。

Linux 进程监控与服务管理_第23张图片

你可能感兴趣的:(linux笔记,linux,vim)