处理器指标
-
CPU利用率(CPU utilization)
- top
-
用户时间(User time)
-
系统时间(System time)
-
等待(Waiting)
-
空闲时间(Idle time)
-
Nice时间(Nice time)
- 低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间
-
平均负载(Load average)
平均负载不是百分比,是下面的和的滚动平均值: 在队列中等待被处理的进程数 等待非中断任务完成的进程数 是TASK_RUNNING和TASK_UNINTERRUPTIBLE的和的平均值。
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数
-
可运行进程(Runable processes)
-
阻塞的(Blocked)
-
上下文切换(Context switch)
- 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
- 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
- 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
-
中断(Interrupts):Linux 中的中断处理程序分为上半部和下半部
-
上半部对应硬件中断,用来快速处理中断。
由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。
-
下半部对应软中断(softirq),用来异步处理上半部未完成的工作,通常以内核线程的方式运行(内核线程是 ksoftirqd/CPU编号 )。
Linux 中的软中断包括网络收发、定时、调度、RCU 锁等各种类型,可以通过查看 /proc/softirqs 来观察软中断的运行情况。
- 某个软中断高的案例
- top发现软中断si很高
- vmstat 确认中断很高
- watch cat proc/softirqs 查看那个软中断变化最快,发现是网络接受最多
- sar 查看哪个网口接受数据包最多
- tcpdump 抓包80端口,发现全是S(sync)包
- 确定是SYN FLOOD
- 某个软中断高的案例
- 进程缺页中断
-
主缺页异常(majflt):需要磁盘 I/O 介入(比如 Swap)时,被称为主缺页异常,如果 MAJFLT 过大,很可能是内存不足。
-
次缺页异常(minflt):可以直接从物理内存中分配时,被称为次缺页异,常如果 MINFLT 过大,很可能是频繁分配 / 释放大块内存 (128k) , malloc 使用 mmap 来分配。对于这种情况,可通过 mallopt(M_MMAP_THRESHOLD, <SIZE>) 增大临界值,或程序实现内存池。
# 查看某进程主次缺页中断情况 ps -o majflt,minflt -C mysqld MAJFLT MINFLT 144856 15296294 # 查看系统内存页面变化情况 # fault/s 每秒缺页中断次数(major + minor) majflt/s 每秒主缺页中断次数 sar -B 1
-
-
-
提高CPU缓存命中率
-
命令
perf record -ag -- sleep 5;perf report # 看各进程CPU使用情况 pidstat -u 1
-
CPU性能优化思路-方法论
-
性能优化的效果判断
三步走理论- 确定性能的量化指标-一般从应用程序纬度和系统资源纬度分析
- 测试优化前的性能指标
- 测试性能优化后的性能指标
-
当性能问题有多个时,优先级问题
先优化最重要的且最大程度提升性能的问题开始优化 -
优化方法有多个时,该如何选
综合多方面因素 -
CPU优化
-
应用程序优化:排除不必要工作,只留核心逻辑
- 减少循环次数 减少递归 减少动态内存分配
- 编译器优化
- 算法优化
- 异步处理
- 多线程代替多进程
- 缓存系统优化:利用CPU缓存本地性,加速缓存访问;
-
控制进程的cpu使用情况,减少程序的处理速度
- CPU绑定
- CPU独占
- 优先级调整
- 为进程设置资源限制
- NUMA优化
- 中断负载均衡
-
-
很重要的一点:切记勿过早优化
-
内存指标
-
空闲内存(Free memory)
-
缓冲和缓存(Buffer and cache)
- Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中
- Buffers 是对原始磁盘块的临时存储,也就是用来缓存将读取和写入磁盘的数据,通常不会特别大(20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。
- Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取和写入文件的数据。这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。
- SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。
- 命令
# 清buffer和Cache echo 3 > /proc/sys/vm/drop_caches
-
kswapd0 回收内存机制
剩余内存小于页低阈值( watermark ),会触发内存的回收。这个页低阈值,可以通过内核选项 /proc/sys/vm/min_free_kbytes 来间接设置。min_free_kbytes 设置了页最小阈值,而其他两个阈值,都是根据页最小阈值计算生成的,计算方法如下 :
pages_low = pages_min*5/4 pages_high = pages_min*3/2
与zone相关的内存信息在 /proc/zoneinfo 可以看到,pages 处的 min、low、high,就是上面提到的三个内存阈值,而 free 是剩余内存页数,它跟后面的 nr_free_pages 相同。nr_zone_active_anon 和 nr_zone_inactive_anon,分别是活跃和非活跃的匿名页数。nr_zone_active_file 和 nr_zone_inactive_file,分别是活跃和非活跃的文件页数。
当剩余内存大于页 高阈值,此时的 kswapd0 不会 回收内存。
回收的内存指的回收文件页和匿名页。对文件页的回收,当然就是直接释放挂回到伙伴系统,或者把脏页写回磁盘后再回收。而对匿名页的回收,其实就是通过 Swap 机制,把它们写入磁盘后再释放内存。
Linux 提供了一个 /proc/sys/vm/swappiness 选项,用来调整使用 Swap 的积极程度。swappiness 的范围是 0-100,数值越大,越积极使用 Swap,也就是更倾向于回收匿名页;数值越小,越消极使用 Swap,也就是更倾向于回收文件页。swappiness 并不是内存的百分比,而是调整 Swap 积极程度的权重,即使你把它设置成 0,当 剩余内存 + 文件页小于页高阈值 时,还是会发生 Swap。
-
匿名页
没有文件背景的页面,为匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件交换,但可以通过硬盘上划分额外的swap交换分区或使用交换文件进行交换。即上面wap作为名词的意思。Swap分区可以将不活跃的页交换到硬盘中,缓解内存紧张。
- Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求中
-
Swap使用(Swap usage)
通过查看空闲内存是否低于内存高水位值判断当前是否有 swap 发生
watch -d grep -A 15 'Normal' /proc/zoneinfo
可以通过查看 vmstat 1 或者 sar -r -S 1 查看系统磁盘缓存buffer和文件缓存cache使用情况,然后通过 top 找出使用最大内存的进程 或者 cachetop 找出使用缓存最多的进程,可定位问题
定位问题后,可以根据 /proc/<pid>/status 中的 VmSwap 找出内存被强制 swap 换出的进程以及对应被换出的内存大小
# 按 VmSwap 使用量对进程排序,输出进程名称、进程 ID 以及 SWAP 用量 $ for file in /proc/*/status ; do awk '/VmSwap|Name|^Pid/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 3 -n -r | head # 输出: $ Xorg 948 17692 kB $ mysqld 4321 9972 kB $ docker-containe 1029 4280 kB $ dockerd 998 2008 kB $ NetworkManager 823 1404 kB $ lightdm 925 808 kB $ lightdm 1125 752 kB
-
Slabs
-
活动和非活动内存
-
命令
# 看各进程内存使用情况 pidstat -r 1
网络指标
- 接收和发送的包(Packets received and sent)
- 接收和发送的字节(Bytes received and sent)
- 每秒碰撞(collisions per second)
- 丢包
- 过载(Overruns)
- 错误(Errors)
块设备指标
- IO等待(Iowait)
- 平均队列长度(Average queue length) 未完成的I/O请求数量。
- 平均等待(Average wait)
- 每秒传输(Transfers per second)
- 每秒读写块(Blocks read/write per second)
- 每秒读写的千字节(Kilobytes per second read/write)
- 命令
# 看各进程磁盘IO读写情况 pidstat -d 1
相关命令
- execsnoop,它可以实时监控进程调用的外部命令
各介质读取速度
介质/方式 | 速度 |
---|---|
L1 cache reference 读取CPU的一级缓存 | 0.5 ns |
Branch mispredict(转移、分支预测) | 5 ns |
L2 cache reference 读取CPU的二级缓存 | 7 ns |
Mutex lock/unlock 互斥锁解锁 | 100 ns |
Main memory reference 读取内存数据 | 100 ns |
Compress 1K bytes with Zippy 1k字节压缩 | 10 us |
Send 2K bytes over 1 Gbps network 在1Gbps的网络上发送2k字节 | 20 us |
Read 1 MB sequentially from memory 从内存顺序读取1MB | 250 us |
Round trip within same datacenter 从一个数据中心往返一次,ping一下 | 500 us |
Disk seek 磁盘搜索 | 10 ms |
Read 1 MB sequentially from network 从网络上顺序读取1兆的数据 | 10 ms |
Read 1 MB sequentially from disk 从磁盘里面读出1MB | 30 ms |
Send packet CA->Netherlands->CA 一个包的一次远程访问 | 150 ms |
其它了解和备忘
- CPU 常见架构
-
SMP (Symmetric Multiprocessing) , 对称多处理器. 顾名思义, 在SMP中所有的处理器都是对等的, 它们通过总线连接共享同一块物理内存,这也就导致了系统中所有资源(CPU、内存、I/O等)都是共享的,当我们打开服务器的背板盖,如果发现有多个cpu的槽位,但是却连接到同一个内存插槽的位置,那一般就是smp架构的服务器,日常中常见的pc啊,笔记本啊,手机还有一些老的服务器都是这个架构,其架构简单,但是拓展性能非常差,从linux 上也能看到:
ls /sys/devices/system/node/# 如果只看到一个node0 那就是smp架构 # 可以看到只有仅仅一个node,经过大神们的测试发现,2至4个CPU比较适合smp架构。
-
NUMA ( Non-Uniform Memory Access),非均匀访问存储模型,这种模型的是为了解决smp扩容性很差而提出的技术方案,如果说smp 相当于多个cpu 连接一个内存池导致请求经常发生冲突的话,numa 就是将cpu的资源分开,以node 为单位进行切割,每个node 里有着独有的core ,memory 等资源,这也就导致了cpu在性能使用上的提升,但是同样存在问题就是2个node 之间的资源交互非常慢,当cpu增多的情况下,性能提升的幅度并不是很高。所以可以看到很多明明有很多core的服务器却只有2个node区。
-
MPP (Massive Parallel Processing) ,这个其实可以理解为刀片服务器,每个刀扇里的都是一台独立的smp架构服务器,且每个刀扇之间均有高性能的网络设备进行交互,保证了smp服务器之间的数据传输性能。相比numa 来说更适合大规模的计算,唯一不足的是,当其中的smp 节点增多的情况下,与之对应的计算管理系统也需要相对应的提高。
-