【Linux学习笔记】十、linux资源管理1

七、linux资源管理

(一)什么是资源管理

1、一台linux机器有哪些资源可以去管理?
从硬件的角度、并结合软件来看:
(1)磁盘资源:
磁盘是提供容量空间给我们用的,所以我们要关注磁盘的读写性能(机械硬盘、固态硬盘)、空间容量、以及如何存储更多的数据。
(2)内存资源: 计算机程序都要加载到内存中,cpu再去内存中取数据,所以你要关注内存的总大小、可用剩余大小、如何让你同时运行更多的程序。
(3)cpu的计算资源:
所有的程序都是cpu去调度、计算运行的。所以要考虑如何让cpu同时处理更多的程序。
(4)网络资源:
网络数据的吞吐量。吞就是你能接收到多少数据,吐就是你能发出去多少数据。

我们管理计算机资源就是围绕着上面的资源进行管理的,比如查看以上资源的使用率来判断机器是否健康运行。

2、windows资源管理器
在windows中,我们可以用“任务管理器”来进行进程管理,了解系统的运行状态。因为看任务管理器,我们可以了解到:
(1)可以从'应用程序'和'进程'标签来查看系统中到底运行了哪些程序和进程。
(2)可以从'性能'和'用户'标签来判断服务器的健康状态。
(3)可以在'应用程序'和'进程'标签中强制中止任务和进程。

windows的资源管理更直白易见,但是如果让你批量管理多个进程、自动化管理进程的启停、重启等操作,图形化的点点点就非常费劲,linux就会更高效。

3、linux资源管理器
linux中,我们查看、管理的命令如下:
(1)内存资源、使用率:free
(2)磁盘资源、使用率:df
(3)CPU资源、使用率:top 、htop 、glances
(4)进程资源、使用率:ps、pstree、pidof
(5)网络资源、使用率:lftop
(6)所有资源的整体查看命令:top、glances、htop

(二)linux进程管理

1、什么是进程

  • 程序,通俗的说,是人类使用计算机语言写的、可以实现特定功能的、并且可以执行的代码集合。比如程序员写的python脚本、bash脚本、golong脚本,是一堆源代码,目的就是解决某个特定问题。是一个静态实体的概念。
  • 进程是cpu正在执行的一个程序或命令,每个进程都是一个运行的实体,并占用一定的系统资源。通俗的讲,就是正在被cpu执行的程序。是一个过程的概念。
  • 比如,谷歌浏览器就是谷歌的程序员写的一堆源码,就是一堆程序。当我们打开谷歌浏览器,就会在系统中看到一个浏览器的进程,当程序被执行时,程序的代码都会被编译成二进制,然后被加载入内存,操作系统会给这个进程分配一个ID,就是PID,也叫进程id,cpu就开始执行这些二进制数据和命令,然后谷歌浏览器程序就跑起来了,我们就可以浏览谷歌浏览器给我们渲染的画面了。当我们打开多个浏览器,就有多个浏览器子进程,但这些进程使用的程序都是chrome。
  •  再比如nginx程序

小结:进程、程序的关系
(1)开发人员把代码写好了,打个压缩包,还未运行的时候,就是一个静态的东西、是程序源代码。程序是数据和指令的集合。
(2)当我们把开发人员写的代码运行起来后,这个静态的程序源代码就变成了一个进程,就是电脑上一个正在运行的程序。
(3)程序运行时,操作系统为了清晰标记每一个进程,为每个进程标记了PID、运行的用户名、内存、cpu等资源的使用情况。 

 

2、进程中的fork概念
(1)我们的操作系统就是一堆进程而已,系统运行时,就产生了0号进程,然后其他进程都是0号进程创建的子进程。
(2)linux启动后,第一个进程就是PID为0,然后通过0号进程fork()出其他的进程。其他进程也可以fork()出它自己的子进程,子进程还可以产生子子进程,子子孙孙一串执行下来。
(3)操作系统的运行就是不断地创建进程、以及销毁进程。 

 如何理解(1):

B:我们之前说过,操作系统是有2部分组成的,一个是核一个是壳。以centos7为例,linux是centos7的内核,centos7只是一个发行版代码,就是在内核之上开发了比如yum这样的工具来做软件管理。同理,ubuntu发行版的操作系统也是linux的内核加ubuntu的发行版代码,就是基于ubuntu开发的系统环境,开发的比如apt软件管理命令。所以,不同的操作系统,其内核是一套、发行版又是一套。这里我们ps查看进程,看到的带中括号的进程名,就是linux内核自动生成的进程。不带中括号的进程名,就是发行版系统用户生成的各种进程。
0号进程就是最先启动的内核进程,0号进程启动了1号进程,1号进程就是linux系统的用户入口,1号进程就会启动一些用户级的进程,比如sshd服务-ssh客户端链接进程-用户bash进程-用户执行的其他进程等。这个例子在下面还会详细讲解其过程。
同时,0号进程还启动了2号进程,2号进程又启动了一大堆内核级进程,也就是提供让操作系统运行的进程。
通过这个图我们就清楚了什么是内核进程什么是用户进程。

  • 如何理解(2)(3): 我们以xshell远程登录终端为例展示这个过程:

现在的情况是,我们的linux服务器的操作系统上运行了一个叫sshd的远程链接服务,现在我用一个客户端,就是我的windows,安装一个xshell软件,我用这个软件通过ssh命令去连接服务器的sshd服务,就产生一堆子进程,现在我们看一下这些进程之间的父子关系:

 小结:上面进程产生的流程是:1号进程生成了sshd服务(当然我们只是拿sshd服务为例,其实1号进程生成了n多进程,就是我们开机就要生成n多进程),然后我们ssh连接这个服务,当连接的时候,就同时默认启动/bin/bash进程(因为连接上还要用户登录,用户登录我们前面讲用户的时候讲过,要读取用户的配置文件,其中就有给用户配置的/bin/bash解释器,所以会同时启动/bin/bash进程),连接成功后,我们在会话中敲打了一些命令,比如ps、grep、ls、cd等命令,这些命令又都是bash去执行的,所以bash进程下面又产生很多命令执行进程。当然如果你敲打的是复杂的命令,那这个命令又会产生一个或多个子进程。就这样环环相扣,一串有序的进程串就形成了。其中每个进程都有它自己的pid,也有它的ppid父进程号。也就是一个进程的产生必须有它自己的pid,还必须有父亲ppid。就是每个进程有且只有一个父进程,但是可以有多个子进程。所以每个进程都能追溯到它的父亲,而且只能有一个父亲,就是能追溯到它是怎么产生的。这就是linux进程生成的前因后果。

  • 再查看一下我们用户自己开启的进程

例子:打开3个ssh会话窗口,一个用于查看进程,2个用于使用vim命令操作,用ps查看它们的父子关系:

linux系统启动产生1号进程--运行了sshd服务,也就是产生了sshd进程--ssh远程连接命令产生的进程--/bin/bash进程--后续各种命令产生的进程

3、孤儿进程、僵尸进程
(1)孤儿进程

  • 当父进程因为某些原因挂了(一般都是因为代码写得不好才出现进程挂掉的情况),那它下面的一个或多个子进程就变成了孤儿进程。
  • 孤儿进程会被系统的1号进程收养,并且由1号进程来回收,处理这些孤儿进程。

孤儿进程由于被1号进程收养,所以孤儿进程的PPID就变成1了。只要孤儿进程把计算机资源释放了,就是孤儿进程释放了执行的相关文件、数据、以及释放进程ID号(系统pid号的数量是固定的,如果pid用完了,就是不能再生成进程pid号了,那就是你的系统要崩溃了),也就是孤儿进程正常消失了,那这对计算机系统是没有影响的。
儿子进程的诞生就是为了执行父进程程序,父进程程序挂掉后,这些子进程就被1号进程收养,所以这些子进程还是在运行着的,当子进程正常运行完毕,1号进程就正常释放这些子进程,所有进程就都消失,系统正常运行。

此时,我的xshell就再也连接不上basenode了,我得在basenode上敲systemctl start sshd命令,重启服务。
孤儿进程对系统是没有影响的,但僵尸进程是有害的。

用python写一个孤儿进程展示脚本: 

(2)僵尸进程

  • 父进程创建出子进程后,如果子进程先挂了(一般也是由于程序代码太差才挂掉的),但是子进程不会通知父进程它挂了,这样父进程就不知道子进程已经挂了这事儿,所以父进程就无法正确送走子进程、清除子进程在系统中的信息,而且父进程由于不知道就也不会告诉操作系统它的子进程挂了,让操作系统清除这个子进程。那么这个子进程和它相关的数据,比如pid,就会一直在被执行着、被保留着不释放资源,此时这个子进程就成了僵尸进程,会对系统产生危害。
  • 当系统中有僵尸进程,你可以通过ps命令找到它,并且它的状态是Z,zombie僵尸进程。
  • 如果系统中产生大量僵尸进程,占据了系统中大量可分配资源,如进程id号,系统就无法正确创建新进程去完成任务,导致系统无法使用,就是系统崩溃。
  •  top命令

用python写一个僵尸进程展示脚本:


 从进程号上看看:

用top看看: 

解决僵尸进程的方法: 

方法2说明:就是等待父进程自己主动退出。那这里它又不会自己退出,我们就给它一个终止信号ctrl+c,让它退出,它就把自己生成的子进程就都带走了,所以僵尸进程就没有了。
方法3说明:上面jiangshi.py脚本里的代码在机器上跑的本质其实是在调度操作系统,而操作系统的多进程、多线程概念都是操作系统本身的,你脚本里的代码其实只是做了一个调用的工作。比如你jiangshi.py文件里的代码只是调用了linux系统的os模块而已。所以你要优化jiangshi.py里面的代码,其实也就是再加一行代码,告诉父进程你结束了,就不会卡死在那了。

4、相关命令
(1)ps命令
ps命令是报告当前系统的进程状态,经常搭配管道符,结合grep去搜索特定进程,也可以搭配kill指令随时中断、删除不必要的程序。

  • ps命令的语法:UNIX和linux操作系统中的ps命令的语法是有所不同的。unix的参数一般不加短横线,比如ps aux命令;而linux的参数一般都带短横线,比如ps -ef命令。下面分别看看两个操作系统的ps命令的参数:
  • UNIX:*
    a 显示所有终端、所有用户执行的进程
    u 显示某个用户执行的进程详细信息
    x 显示操作系统所有进程信息
    f 显示进程树形结构
    o 格式化显示进程信息,指定如pid
    k 对进程属性排序,比如 k %mem 正序排序,k -%mem 逆序排序
    --sort 再进行排序,比如--sort %men 根据内存使用率显示
  • linux:*
    -e 显示所有进程
    -f 显示进程详细信息,比如pid,udi,进程名等
    -p 指定pid,显示其信息,比如ps -fp xxx进程id
    -c 指定进程的名字查看,比如ps -fc sshd
    -u 指定用户名,查看某个用户的进程信息,比如ps -fu liyy

 

说明:
C表示CPU的占用率;STIME表示进程的启动时间;TTY表示终端设备,发起该进程的设备识别符号,如果显示?则表示该进程并不是由终端设备发起。TIME表示进程实际使用CPU的时间;CMD表示该进程的名称或者对应的路径。

USER:该进程属于的用户;PID:进程号;**%CPU:该进程占用cpu的资源比率;%MEM:该进程占用物理内存百分比;VSZ:进程使用的虚拟内存,单位是kbytes; RSS:该进程占用固定的内存量,单位是kbytes;TTY:该进程运行的终端设备;START:进程启动时间;TIME**:cpu运行时间;COMMAND:进程命令,名字带有[]表示是内核态进程,没有中括号表示是用户执行的进程。
STAT:进程目前状态,可以man ps查看细节。其中:R表示正在运行中;S表示终端睡眠中,可以被唤醒;D表示不可中断睡眠;T:进程被暂停;Z表示已停止,无法由父进程正常终止,变成了zombie僵尸进程。
  其中还有的进程额外字符:
    +:前台进程,比如R+,表示程序运行在前台,一旦终止,程序结束,数据丢失。
    l:多线程进程,比如SI表示程序是多线程的
    N:低优先级进程,比如SN表示优先级很低的进程
    <:高优先级进程
    s:进程领导者,就是含有子进程,比如Ss表示父进程。
    L:锁定到内存中

(2)top命令
查看系统整体情况,是linux的资源管理器。直接敲命令就会进入一个交互式的界面。 

  • top命令的快捷键:
    z:打开和关闭颜色
    M:将结果按照内存MEM从高到低进行降序排列
    m:切换内存memmory的显示格式
    P:将结果按照cpu使用率从高到低进行降序排列
    1:就是数字1,当服务器有多个CPU时,可以使用1快捷键来切换是否展示显示各个cpu的详细信息
    q:小写q,表示退出。
  • 先看看第一行结果:
  • 再具体看看cpu的详细指标:
  • 再具体看看内存的详细指标:
  • 再看看swap分区的详细指标:

说明:swap分区是一块特殊的硬盘空间。当实际内存不够用的时候,操作系统就从磁盘中取出一部分暂时不用的数据,放在交互内存中,从而使当前的程序腾出更多的内存量。
linux中的交换分区swap,类似于win中的虚拟内存,就是当实际内存不够的时候,把一部分硬盘空间虚拟成内存使用,从而缓解内存不足的情况。
所以,swap交换分区的作用就是,通过OS的调取,程序可以用到的内存远超实际物理内存。而且磁盘加个比内存便宜得多,使用swap交互空间是非常划算的,但由于会频繁的读写磁盘,这种方式会降低系统运行效率。所以在线上环境,这个swap缓存功能是直接关闭的。

  • 跑个死循环看看cpu、内存等的变化情况:

平均负载率高了,内存使用的多了,怎么办?找到对应的进程,看看是什么程序,是捣蛋的就杀死:kill -9 9672 ,-9是强制杀死,进程结束,机器负载下将。

(3)htop命令
htop和top命令如出一辙,就是不同的工具而已,实现的功能都是一样的,可能有的人看htop的交互界面更友好一些,你可以用htop命令。但这个小工具需要安装:yum install htop -y

(4)glances命令
也是一个资源查看器,但是是用python开发的,所以这个工具移植性特别强,就是linux\macos\win平台都可以跑这个工具的程序。这个工具也是需要安装:yum install glances -y

 这个程序部署在你的阿里云上,就可以以web形式展示系统资源了。

待续。。。图片太多了,都不让上传了,后面再开启一篇新文章吧

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值