性能指标
进程指标
进程关系
父进程创子进程时,调fork系统调用。调用时,父给子获取一个进程描述符,并设置新的pid,同事复制父进程的进程描述符给子进程,此时不会复制父进程地址空间,而是父子用相同地址空间。程序执行完成后,子进程调用exit系统调用,会释放大部分数据结构,并通知父进程,此时子进程是僵尸进程,当父进程收到子进程的终止通知后,父进程会清除子进程所有数据结构和进程描述符
进程与线程
线程是进程的实体,是cpu调度和分配的基本单位,线程是比进程更小的独立基本单位
一个线程只能属于一个进程
进程是资源最小分配单位,进程的所有线程共享进程的所有资源,线程不拥有资源
真正运行工作的是线程
线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
进程的线程也可以并发执行
进程优先级和nice级别
一个cpu在同一时间只能执行一个进程
进程优先级可分为动态和静态。内核使用启发式算法决定开或关动态优先级。可通过改nice级别直接改进程静态优先级。nice范围从19到-20,越小优先级越高,默认为0 只有root才能把nice级别调整为负数(高优先)
进程状态
僵尸进程产生原因:子进程终止时从内存中移除,进程描述符仍在内存中,子进程状态变成EXIT_ZOMBIE,向父进程发送SIGCHLD信号,父进程此时应该调用wait调用获取子进程退出状态,wait调用后,僵尸进程则从内存中移除。因此僵尸进程生存期是从子进程终止到父进程调用wait之间,由于部分原因导致父进程不调用wait,就会导致僵尸进程存在
内存指标
物理内存和虚拟内存
虚拟内存是硬盘模拟的内存。内存使用有一个映射,物理内存和逻辑内存都被映射为虚拟内存
页高速缓存页写回机制
页是物理或虚拟内存中一组连续的线性地址,linux内核以页为单位处理内存,页大小常见的有4KB
进程请求页时,若有可用页,则内核直接分配给内存,否则,内核从其他进程或页缓存拿一部分分给该进程
进程请求页时,若页不够,内核会尝试释放特定内存以供使用,此过程是内存回收,kswapd内核线程负责页回收
kswapd在虚拟内存管理中负责换页,os周期唤醒kswapd,它基于最近最少使用原则,在活动页中寻找可回收的页面,看内存是否紧张,若不紧张则睡眠。kswapd有两个阈值,pages_hige pages_low,空闲页低于pages_low时,kswapd进程会扫描内存并每次释放32个空闲页,直到free page数量达到pages_high
内存负载较大时一般会看到两个进程 kswapd0和kswapd1。如果这些进程占资源多,需要考虑优化系统或添加硬件资源
某些情况kswapd若被频繁唤醒会过度消耗cpu,此时可设置大页内存解决
swap交换空间
linux内存采用分页存取,内核会在适当时候将物理内存不常用的数据块自动换到swap中
无论物理内存是否足够,linux系统都会不时交换出不常用的物理页面,可以避免内存交换等待时间。交换的一句是最近最常使用算法。有时会看到 物理内存有很多 但swap却用了很多,这可能是因为内存交换,当内存不够时,会换出较多内存到swap,等内存够用了,换出去的不会自动换回来。swap在使用时会首先换到物理内存,若物理内存不够会导致再被换出去
文件系统指标
ext3/ext4/xfs
linux的fs是从vfs开始,然后是ext,ext2。ext3是ext2基础上增加日志形成的
ext2 fs一般由超级块,块组描述符,块组组成,使用索引节点(inode)记录文件信息,一个inode对应一个文件。索引节点是一种数据结构,存放文件的大小,访问创建时间,属主属组等信息
为避免磁盘大量访问导致的性能问题,一般fs采用异步方式,即读写不是同步进行,比如改了某个文件,改动放在内存中而不是立即写入磁盘,但系统有一个守护进程,再以恶合理时间段将操作批量写入盘
ext2 fs由冗余保存关键元数据信息备份功能,一般不会出现数据完全丢失。系统重启时,ext2会调用fsck恢复损坏的元数据信息,但fs很大时扫描很慢,ext3可以解决此问题。
ext3是一种日志式文件系统,其实就是在ext2基础上增加了一个特殊的inode(日志文件),用以记录文件元数据或各种写操作变化。这样,磁盘真正写入前,首先通过日志记录了文件系统各种操作和元数据变化,因此ext3中,如果写入了日志但磁盘改动还没写到盘上,可以通过日志记录恢复文件内容
ext4可提高系统性能,例如ext4支持更多子目录数量,支持日志校验,快速fsck等
rhet6和centos6以ext4为文件系统 rhet7和centos7以xfs作为文件系统,xfs也是一个高级日志文件系统,
文件系统选择和优化
web app 博客类应用 读频繁写操作一般 可ext4和xfs
db类应用 写操作频繁 可以xfs 其次是ext4 其次是ext3
普通应用 可以ext3和ext2 ext2没有日志记录功能 省了很多磁盘性能
消除fs瓶颈方法
写频繁,读频繁,根据特点存放不同目录,创不同类型fs
磁盘IO指标
磁盘IO调度策略
磁盘调度器总体目标是磁头可以总王一个方向移动,到了目标再反向移动,像电梯,算法也可以叫电梯算法。算法有好几种:完全公平排队、期限、noop,具体用哪种算法可由内核参数elevator决定
完全公平排队 平均分配时间片
期限 保证请求在最长的一个规定时间内一定能响应,避免饥饿
Noop 表示没有操作 也叫电梯调度算法,在FIFO队列里,对请求做适当合并
磁盘和缓存机制
通过缓存解决cpu 内存 磁盘之间速度不一致问题。cpu和磁盘速度差靠L1 L2 RAM等多级缓存消除。linux通过独立的磁盘缓存机制--页高速缓存 解决cpu和磁盘的差异
页高速缓存 从盘读出来的数据先放到内存 当数据要改变时 先改变内存的数据 由于磁盘延迟写 此时内存数据和盘数据不一致 内存的数据叫脏缓存 脏缓存应尽快同步到磁盘上 否则系统下电内存数据会丢失
同步脏缓存是由内核一个线程(flusher)完成。脏缓存写回磁盘有如下场景
1空闲内存不足时 需释放部分缓存 会回写脏页面
2 脏页中驻留内存时间超过特定阈值 回写
3 用户调用sync 和fsync系统调用时 是用户的强制回写指令 也会回写
flusher线程历史 linux2.6以前 flusher线程通过bdflush线程实现 内存达到特定阈值一下 bdflush线程唤醒 周期运行回写脏页 bdflush问题是只有一个bdflush线程 业务量大有阻塞风险 为解决此问题linux2.6引入了pdflush线程 pdflush线程数量是动态的 取决于系统IO的负载 pdflush有某个盘阻塞导致所有pdflush线程阻塞问题 linux2.6.32引入全新flusher线程概念 有多个flusher线程 同时不是每个线程面向所有盘 而是一个flush对应一个盘 避免了pdflush的问题
页回写一些阈值可在/proc/sys/vm中找到,某几个重要指标如下
dirty_background_ratio 脏页占总内存百分比,脏页大小达到此阈值 触发flusher线程开始回写
dirty_background_bytes 脏页占内存数量
dirty_expire_interval 单位0.01秒 描述超时多久的数据将被pdflush线程回写
dirty_writeback_centisecs flusher线程唤醒间隔 单位是0.01秒
dirty_expire_centisecs 脏数据过期时间超过该时间后 flusher唤醒时会将脏数据写回到盘上 单位0.01秒
调优工具
cpu工具
常用的很多 比如vmstat uptime mpstat等
vmstat
vmstat Virtual Memory Statistics 一般是个默认安装命令
vmstat [-V] [-n] [delay] [count] delay是输出间隔 以间隔为周期一直输出 如果不加delay命令就显示一次然后结束 count是输出次数 不带则输出一次或一直输出 带了则输出count次信息后结束输出
-V 打印版本
vmstat 1 每秒输出一次
vmstat 1 5 每秒输出一次 输出5次结束
procs r 表示运行和等待cpu时间片的进程数,此值若长期大于系统cpu个数 说明cpu不足
procs b 表示等待资源的进程数,如盘资源,内存资源
swpd swap去内存数量 单位为KB
free 空闲物理内存量
buff 块设备读写缓冲
cache 页缓存数量
swap
si 磁盘写入内存的数量
so 内存调入磁盘的数量。一般si 和so长期为0 如果长期不为0则内存不足
io
bi 块设备读入数据总量KB/s
bo 写入块设备的数据总量 bi+bo参考值为1000 超过1000则IO性能可能不足
system
in 每秒设备中断数量
cs 每秒产生上下文切换次数 这俩只越大 内核消耗的cpu会越多
cpu
us 用户消耗cpu时间
sy 内核消耗cpu时间 根据经验us+sy参考是为80%
id idle cpu
wa 等待IO占的cpu wa参考值为20
uptime
输出依次为系统时间 上次开机到当前运行时间 当前用户 系统1 5 15分钟平均负载
注意load average 不能大于系统cpu个数
mpstat
Multiprocessor Statistics 是一个cpu试试监控工具 和vmstat类似 mpstat通过/proc/stat状态信息同居数据 mpstat可以查看多核cpu中每个核的统计数据 vmstat只能查看整体cpu使用情况
mpstat [-P {cpu|all}] [internal] [count]
-P 表示监控哪个cpu cpu编号范围为0~cpu个数-1
internal 和count与vmstat类似
usr 用户消耗cpu
nice 正常进程消耗cpu
irq 硬中断占cpu
soft 软中断占cpu
steal 内存紧张下的页操作
guest 运行虚拟处理器时cpu花费时间占比
gnice 运行带有nice优先级的cpu花费时间占比
内存工具
常用的有free smem等
smem
RSS 所有进程RSS相加会超过系统总内存 是因为RSS包含了进程间共享内存
PSS Proportional Set Size 进程的共享内存 对于单个享用进程 共享的内存是均分给每个进程 相比于RSS更准确 PSS总和等于系统总内存
USS 进程独自占用的内存 不包含任何共享部分
smem一般不系统自带 需要手动安装
命令用法 smem -k -s pss/uss/rss -p -u -P
-k 显示内存单位,类似于df的-h
-s 排序 可跟pss/uss/rss等
-p 按百分比显示进程内存
-u 显示每个用户占的总内存
-P 跟进程名 显示进程内存
磁盘工具
常用的有iotop iostat等