IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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指令

查看父进程

终止进程

查看进程树

?服务管理

service 指令

查看服务

运行级别

update-rc.d指令

systemctl指令

?防火墙

?动态监控进程

top指令

调度算法

top交互选项

监控网络状态


进程监控

ps指令

有以下选项

后缀? ? ??说明
-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,主要有以下作用:

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

这里就是用到的作用4

终止进程

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

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

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

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

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

查看进程树

?pstree?

常用指令

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

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

加个p就有id了:

服务管理

service 指令

服务管理本质就是进程管理,只是在后台运行而已,然后会监听某个端口等待其他程序的请求,比如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命令可以快速创建。

格式为?update-rc.d?<service name> start|stop| <order number> <run levels>

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

快速删除指令为

?????? sudo update-rc.d -f <service name> remove

systemctl指令

使用方法为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指令

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;

发现这不是实时的

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

实时进程调度策略:

  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交互选项

常用的有以下几个选择:

操作功能
Pcpu使用从小到大排,默认
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情况。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 11:14:59  更:2021-09-10 11:15:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:22:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码