| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux 进程监控与服务管理 -> 正文阅读 |
|
[系统运维]Linux 进程监控与服务管理 |
目录 进程监控ps指令有以下选项
当然也可以不加任何参数,一般直接加 -aux,BSD 风格 ?格式为用户+进程id+cpu占用百分比+物理内存占用百分比+虚拟内存占用大小(kb)+实际内存占用大小(kb)+终端信息+运行状态+启动时间+占用的cpu时间+进程名字/启动该进程的指令 扔个运行状态表: 过滤直接利用管道grep 查看父进程为什么要看这玩意儿呢,主要是为了方便对不同父进程及其子进程分类方便管理 ps -ef可以看到指令的父进程id,System V风格
格式为用户+进程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就有id了:
|
关键字? ? ? | 描述 |
-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情况。
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年5日历 | -2025/5/3 3:20:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |