一、程序与五大性能
1.程序
程序:执行特定任务的一串代码,静态的存放在硬盘上
1.是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具
2.用于描述进程要完成的功能,是控制进程执行的指令集
2.五大性能
开启进程会消耗硬件资源(五大性能:内存使用率、硬盘容量、硬盘读写性能、cpu使用率、网络带宽),硬件资源消耗完了轻则卡顿重则死机,要时刻关注。
内核功用:进程管理,内存管理,文件系统,网络功能、驱动程序、安全功能等
五大性能 | 命令 |
内存使用率 | free |
硬盘使用率 | df |
磁盘读写性能 | iostat |
cpu使用情况 | top、ps、w、iostat、uptime |
网络带宽 | iftop |
1.查看内存使用率命令:free
1.free ##查看内存使用总大小
2.free -h ##以GB显示大小
3.free -m ##以MB显示大小
4.free -s 几秒 ##每隔几秒刷新一次(这里假设3秒刷新一次)
2.查看cpu使用率:ps、top、w
1.查看cpu占用情况:top
3.w ##也能查看cpu的负载情况
3.硬盘容量、硬盘使用率
1.查看硬盘容量:dfv
2.查看硬盘容量带单位:df -h
4.磁盘读写性能
1.查看每秒读多少写多少:iostat
5.网络带宽
1.系统版本:cat /etc/redhat-release
2.查看ip地址、子网掩码、广播地址:ifconfig
二、进程和线程
1.进程
进程是运行中的程序,是有生命周期的,程序的执行实例,拥有独立的资源和状态
进程特征:
1.动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的
2.并发性:任何进程都可以同其他进程一起并发执行
3.独立性:进程是系统进行资源分配和调度的一个独立单位
4.结构性:进程由程序、数据和进程控制块三部分组成
2.线程
线程是进程中的执行路径,共享进程的资源和地址空间,多个线程可以并发执行,实现程序的并发处理。线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、打开的文件)和一个或多个线程组成。
3.协程
协程(Coroutines):一种基于线程之上,但又比线程更加轻量级的存在,这种由程序员自己写的程序,管理的轻量级线程叫做『用户空间线程』,具有对内核来说不可见的特性
4.进程与线程的区别
1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其他进程不可见
4.线程上下文切换比进程上下文切换要快得多
5.进程优先级
表示优先级有两个参数:PR(Priority)和NI(Nice)
我们可以使用top命令看到
这两个相加为最终优先级:PRI(最终值)=PRI+NI,最终值越小,优先级越高
6.进程使用内存的问题
1.内存泄漏:Memory Leak
指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
2.内存溢出:Memory Overflow
指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出
3.内存不足:OOM
内存不足(out of meory):给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
当我们出现内存不足(OOM)时常使用的解决办法:
1,限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用
2,给系统增加swap空间
4.查看进程中的线程
这里的-p是显示进程pid号
命令格式:pstree -p
5.查看当前内存占用情况
命令格式:pmap pid号
注:.so结尾的一般是功能模块
三、进程状态
1.进程的基本状态
1.创建状态:进程在创建时需要申请一个空白PCB(process control block)进程控制块,向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
2.*就绪状态:进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
3.*执行状态:进程处于就绪状态被调度后,进程进入执行状态
4.阻塞状态:正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞,在满足需求时进入就绪状态等待系统调用
5.终止状态:进程结束、出现错误或被系统终止,进入终止状态无法再执行
2.状态之间转换六种情况
1.运行---就绪:主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态
2.就绪---运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
3.运行---阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
4.阻塞---就绪:进程所等待的事件已经发生,就进入就绪队列
5.阻塞---运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
6.就绪---阻塞:就绪态根本就没有执行,谈不上进入阻塞态
1.进程更多的状态
1.运行态:running
2.就绪态:ready
3.睡眠态:分为两种,可中断:interruptable不可中断:uninterruptable
4.停止态:stopped,暂停于内存,但不会被调度,除非手动启动
5.僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭。解决办法:杀死父进程可以关闭僵死态的子进程但不推荐这样做。结束父进程,父进程会回收子进程的硬件资源,子进程如果出现意外关闭,父进程无感知就不会收回资源,人为关闭父进程,资源不会回收产生僵尸进程,当一个子进程终止时,内核会将其相关信息保留在系统中,以供父进程查询。僵尸进程不会执行任何代码,也不会占用系统资源,但它们的进程表项和一些资源(比如PID等)仍然存在于系统中,这可能导致系统中存在大量僵尸进程,造成资源浪费
2.解决僵尸进程
1.先制造一个僵尸态
这里可以看到bash(5806)是父进程,bash(8969)是子进程
先停掉父进程再停掉子进程
然后另开一个xshell用ps aux |grep Z查看僵尸态(Z)
两种解决办法:
1.恢复父进程,可以看到恢复后就没有僵尸态了
2.(不推荐)杀掉父进程
四、进程分类
1.进程类型
1.守护进程:daemon,在系统引导过程中启动的进程,和终端无关
2.前台进程:通过终端启动的进程,跟终端相关
注:二者可以相互转化
前台执行:会影响当前的操作
后台执行:不会影响当前的操作
特性:
1.将前台程序放入后台执行,因为这样可以并行执行
命令 & | 将前台命令放入后台执行 |
命令 ctrl+z | 将运行中的前台命令放入后台挂起 |
jobs | 后台任务列表,会显示序号 |
bg 序号 | 继续运行后台的命令 |
fg 序号 | 将后台程序调回前台 |
五、命令
1.ps:静态查看进程信息
ps命令是用于查看当前运行的进程信息的命令,它提供了有关正在运行的进程的详细信息,例如进程ID(PID)、父进程ID(PPID)、进程状态、CPU和内存使用情况等
选项 | 功能 |
a | 显示当前终端下的所有进程信息,包括其他用户的进程 |
u | 使用以用户为主的格式输出进程信息 |
x | 显示当前用户在所有终端下的进程信息 |
-e | 显示系统内的所有进程信息 |
-l | 使用长格式显示进程信息 |
-f | 使用完整的格式显示进程信息 |
[选项]-- soft | 对属性排序,属性前加 - 表示降序排列 |
1.ps:静态查看进程信息
2.ps aux:查看系统中的所有进程信息,常用选项
表头 | 含义 |
USER | 该进程是由哪个用户产生的 |
PID | 进程的ID |
%CPU | 该进程占用CPU资源的百分比,占用的百分比越高,进程越耗费资源 |
%MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源 |
VSZ | 该进程占用虚拟内存的大小,单位为KB |
RSS | 该进程占用实际物理内存的大小,单位为KB |
TTY | 该进程是在哪个终端运行的 |
STAT | 进程状态 |
START | 该进程的启动时间 |
TIME | 该进程占用CPU的运算时间,注意不是系统时间 |
COMMAND | 产生此进程的命令名 |
2.TTY
tty1~tty7 | 代表本地控制台终端(可以通过AIt+F1~F7快捷键切换不同的终端) |
tty1~tty6 | 本地的字符界面终端 |
tty7 | 图形终端 |
pts/0~255 | 虚拟终端,是远程连接的终端,第一个远程连接占用pts/0,第二个远程连接?代表和终端无关,系统进程 |
3.STAT进程状态
进程状态 | 含义 |
-D | 不可被唤醒的睡眠状态,通常用于I/0情况 |
-R | 进程正在运行 |
-S | 进程处于睡眠状态,可被唤醒 |
-T | 停止状态,可能是在后台暂停或进程处于除错状态 |
-W | 内存交互状态 |
-X | 死掉的进程,无法出现这种 |
-Z | 僵尸进程,进程已经终止,但是还会占用硬件资源 |
-< | 高优先级(以下状态在BSD格式中出现) |
-N | 低优先级 |
-L | 被锁入内存 |
-s | 包含子进程 |
-l | 多线程(小写L) |
-+ | 位于后台 |
4.ps -lef:这里效果同上,加l是以长格式显示
pa aux | ps -ef | |
排序 | 用户 | 进程的启动时间 |
输出 | 包含更多例如CPU使用率和内存使用量 | 包含更多的进程状态相关的列,例如UID |
5.查看进程的特定属性
ps -o pid,ppid,cmd,%cpu,%mem
6.仅显示父进程pid、cpu占用
ps -eo ppid,%cpu
7.进程排序--sort
1.ps a --sort=user:按照用户排序,以显示同一用户的进程在一起
2.ps a --sort=pid:按照进程ID排序
3.ps a --sort=cpu:按照CPU使用率
4.ps a --sort=mem:按照内存使用量
5.ps a --sort=time:按照进程运行时间
6.ps aux --sort=cpu | head -n 5:按cpu占用率降序排序所有进程,并显示前七行
7.ps aux --sort=-pid:按pid降序排列
2.top:动态查看进程信息
top 命令可以动态地持续监听进程的运行状态。top命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,从而更清楚进程的运行状态。
1.top:动态查看进程信息
第一行基础信息
18:48:19 | 系统当前时间 |
up 1:40 | 系统的运行时间 |
3 user | 当前登录了三个用户 |
load average:0.00,0.01,0.05 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载 |
第二行进程信息
Tasks:159 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
158 sleeping | 睡眠的进程数 |
0 stopped | 正在停止的进程数 |
0 zombie | 僵尸进程数,如果不是0,则需要手工检查僵尸进程 |
第三行CPU信息
%cpu(s):0.0 us | 用户模式占用的CPU百分比,个人用户开启进程的cpu占用率 |
0.0 sy | 系统模式占用的 CPU 百分比 |
0.0 ni | 改变过优先级的用户进程占用的 CPU 百分比 |
100.0 id | 空闲 CPU 占用的 CPU 百分比 |
0.0 wa | 等待输入/输出的进程占用的 CPU 百分比 1 |
0.0 hi | 硬中断请求服务占用的 CPU 百分比 |
0.0 si | 软中断请求服务占用的 CPU 百分比 |
0.0 st | st(steal time)意为虚拟程序占用 cpu 时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行物理内存信息
KiB Mem:3865308 total | 物理内存的总量,单位为KB |
3104152 free | 空闲大小 |
311300 used | 已经使用的物理内存数量 |
449856 buff/cache | 作为缓冲的内存数量 |
第五行交换分区swap信息
KiB Swap:4063228 total | 交换分区(虚拟内存)的总大小,单位为KB |
4063228 free | 空闲交换分区的大小 |
3260408 avail Mem | 作为缓存的交换分区的大小 |
第六行系统进程信息
PID | 进程的ID |
USER | 该进程所属的用户 |
PR | 优先级,数值越小优先级越高 |
NI | 优先级,数值越小优先级越高 |
VIRT | 该进程使用的虚拟内存的大小,单位为KB |
RES | 该进程使用的物理内存的大小,单位为 KB |
SHR | 共享内存大小,单位为 KB |
S | 进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程共占用的 CPU 时间 |
COMMAND | 进程的命令名 |
2.top命令的选项
top -u username:显示特点用户的进程使用情况(这里拿root做演示)
top -p pid:显示特点PID的进程使用情况(这里拿1做演示)
top -H:显示进程的线程视图,并按照线程ID(LWP)排序
top -o:可以使用不同的排序字段,例如top -o %MEM 将使用内存使用率进行排序
top -n:设置top命令的显示次数或循环次数,例子:top -n 6 将top命令的输出限制为6次
top -b:以批处理模式运行top命令,将结果输出到标准输出,适用于脚本和后续处理
top -d:设置刷新间隔,即更新数据的时间间隔,例子:top -d 9将每隔9秒刷新一次数据
3.top命令的交互界面
在top命令的交互界面中,可以使用不同的键来执行各种操作和切换不同的视图
k | 杀掉选中的进程 |
1 | 切换到全局统计视图 |
m | 切换内存使用视图 |
t | 切换进程排序模式,可以按不同的字段排序进程列表 |
3.pstree:以树状结构显示当前系统中运行的进程
pstree命令以树状结构显示当前系统中运行的进程,其中包括进程的父子关系和层级关系
命令格式:pstree 选项 PID或用户名
-a | 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等 |
-p | 显示PID |
-T | 不显示线程thread,默认显示线程 |
-u | 显示用户切换 |
-H | pid高亮显示指定进程及其前辈进程 |
1.pstree:显示所有进程
2.pstree 11585 显示pid为11585的进程
3.pstree -p root:显示用户root的进程和pid
4.prtstat:根据PID查询程序名
1.prtstat 51936:查看PID为51936的进程
2.pgrep/pidof:根据程序名查PID,排列方式不同
5.vmstat:监控系统资源
用于报告虚拟内存统计信息,监视系统的内存、进程、交换等方面的性能,这些信息对于诊断系统性能问题非常有用
1.process进程信息
r:等待运行的进程数,数量越大系统越繁忙
b:不可被唤醒的进程数,数量越大系统越繁忙
2.memory内存信息
swpd:虚拟内存的使用情况,单位为KB
free:空闲的内存容量,单位为KB
buff:缓冲的内存容量,单位为KB
cache:缓存的内存容量,单位为KB
3.swap交换分区信息
si:从磁盘中交换到内存中数据的数量,单位为KB
so:从内存中交换到磁盘中数据的数量,单位为KB,这两个数越大,表明数据需要经常在磁盘和内存之间进行交换,系统性能越差
4.io磁盘读/写信息
bi:从块设备中读入的数据的总理,单位为块
bo:写到块设备的数据总理,单位为快
注:io磁盘的两个数越大,代表系统的I/O越繁忙
5.system系统信息
in:每秒被中断的进程次数
cs:每秒进行的事件切换次数
注:这两个数字越大,代表系统与接口设备的通信越繁忙
6.cpu信息
-us:非内核进程消耗CPU运算时间的百分比
-sy:内核进程消耗CPU运算时间的百分比
-id:空闲CPU的百分比
-wa:等待I/O所消耗的CPU百分比
-st:被虚拟机所盗用的CPU百分比
六、结束进程
1.kill:根据进程的PID向进程发送信号以终止或操作进程
命令格式:kill 信号 PID
-1 | 重新加载进程 |
-9 | 强制结束进程 |
-19 | 暂时停止进程 |
-18 | 让进程从停止状态恢复 |
2.killall:根据进程名称终止匹配的所有进程
命令格式:killall 选项 信号 进程名
-u | 仅终止指定用户的进程 |
-l | 列出可用的信号列表 |
-i | 交互式,询问是否要杀死某个进程 |
-I(这里是大写i) | 忽略进程名的大小写 |
注:killall -i 信号 进程名:交互式终止进程,终止前会进行询问
七、计划任务的管理
1.crontab工具:定期执行命令或脚本的工具,可以按照指定的时间表安排命令的执行,无需手动操作
命令格式:crontab 选项 file文件夹
选项 | 功能 |
-u | 用来设定某个用户的crontab服务,例如 “-u demo” 表示设备 demo 用户的 crontab 服务,此选项一般有 root 用户来运行。 |
-e | 编辑某个用户的crontab文件内容,如果不指定用户则表示编辑当前用户的crontab文件 |
-l | 显示某用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容 |
-r | 从/var/spool/cron删除某用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件 |
-i | 在删除用户的crontab文件时,出现确认提示 |
查看/etc/crontab文件
这里前面必须要加上5个*,从左到右*依次释义如下:
第一个*:minute(0-59)分钟,从0到59的整数
第二个*:hour(0-23)小时,从0到23的整数
第三个*:day of mouth(1-31)一个月中的几号,从1到31的整数 (必须是指定月份的有效日期)
第四个*:mouth(1-12)or jan,fed,mar,apr......几月份,从1到12的整数 (或如Jan或Feb简写的月份)
第五个*:day of week(0-6)(sunday=0 or 7) or sun,mon,tue,wed,thu,fri,sat一周中的星期几,从0到7的整数,0或7用来描述周日 (或用Sun或Mon简写来表示)
注:*表示所有可用的值,比如*在指month时表示每月执行(需要符合其他限制条件)该命令,整数间的-表示整数列,比如1-4意思就是整数1,2,3,4,指定数值由逗号分开。如:3,4,6,8表示这四个指定整数,符号/指定步进设置。/表示步进值。如0-59/2定义每两分钟执行一次。/也可用星号表示。如*/3用来运行每三个月份运行指定任务,以#开头的为注释行,不会被执行。
user-name:用户名(注:root表示以root用户身份来运行,run-parts表示后面跟着的是一个文件夹,要执行的是该文件夹下的所有脚本)
command:需要执行的命令(可用as ls /proc >> /tmp/proc或 执行自定义脚本的命令)
to be executed:待执行
crontab -u | 设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 |
crontab -l | 列出某个用户的cron服务的详细内容 |
crontab -r | 删除某个用户的cron服务 |
crontab -e | 编辑某个用户的cron服务 |
1.crontab定时任务
1.6个选项都不能为空:* * * * * 命令。必须填写,如果不确定,则使用*,代表任意时间
2.crontab定时任务的最小有效时间是分钟,最大有效时间是月,像2018年某时执行,3点30分30秒这样的事件都不能被识别
3.在定义时间时,日期和星期最好不要在一条定时任务中出现,因为他们都以天为单位,非常容易让管理员混淆
4.在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径,有时使用相对路径会报错
2.例子:每个月的1号早上5点复制/bin/bash到/mnt下
2.at工具:一次性计划任务
单个命令的执行,安排命令“command”在上午9:30执行
在相对时间执行命令。安排命令“command”在当前时间过两个小时执行
从文件中执行命令
七、解决问题
1.中毒
2.确定单线程还是多线程
3.过滤僵尸进程
4.统计进程总数,用top命令可以直接看到,tasks可以直接看到,也可以用ps aux |wc -l
统计某用户的进程总数:pgrep -u 用户名 |wc -l
5.根据pid号能找到进程的具体位置
6.删除大文件不释放空间
7.误删恢复
8.服务器运行了3天,3天之后非常卡,就是因为缓存问题
echo 3 > /proc/sys/vm/drop_caches:清缓存
确定端口是否被打开,找到哪些进程打开了端口:lsof -i :端口