linux性能问题排查

linux性能优化

实际应用过程中我们通常关注CPU,内存,网卡,硬盘

1、系统工具

1.1 进程

1.1.1 ps

# 选项
a  选项包括所有终端中的进程
x 选项包括不链接终端的进程
u 选项显示进程所有者的信息
f 选项显示进程树,相当于 --forest
k|--sort 属性 对属性排序,属性前加 - 表示倒序
o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
L 显示支持的属性列表
-C cmdlist 指定命令,多个命令用,分隔
-L 显示线程
-e 显示所有进程,相当于-A
-f 显示完整格式程序信息
-F 显示更完整格式的进程信息
-H 以进程层级格式显示进程相关信息
-u userlist 指定有效的用户ID或名称
-U userlist 指定真正的用户ID或名称
-g gid或groupname 指定有效的gid或组名称
-G gid或groupname 指定真正的gid或组名称
-p pid 显示指pid的进程
--ppid pid 显示属于pid的子进程
-t ttylist 指定tty,相当于 t
-M 显示SELinux信息,相当于Z
# 用法
	查看详细进程信息
	ps aux
	ps -ef
    查看进程父子关系
    ps auxf
    查看特定的属性
    ps axo pid,cmd,%mem,%cpu
    # 排序
    ps aux k -%cpu # -为倒序
    #以进程树显示系统中的进程如何相互链接
	ps -e --forest
	# #查找指定进程名所有的所属PID,在编写需要从std输出或文件读取PID的脚本时这个参数很有用
	ps -C httpd,sshd -o pid=
	#排序,查找占用最多内存和CPU的进程
	ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head
	ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
	# #使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视
	watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'

1.1.2 prtstat


1.1.3 pgrep

功能: 搜索进程
选项:
-u uid: effective user,生效者
-U uid: real user,真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程

1.1.4 top

功能:
		实时显示进程详细状态
启动选项:
-d # 指定刷新时间间隔,默认为3秒
-b 全部显示所有进程
-n # 刷新多少次后退出
-H   线程模式
说明:
    us:用户空间
    sy:内核空间
    ni:调整nice时间
    id:空闲
    wa:等待IO时间
    hi:硬中断
    si:软中断(模式切换)
    st:虚拟机偷走的时间
使用:
    帮助:h 或 ? ,按 q 或esc 退出帮助
    退出命令:q
    修改刷新时间间隔:s
    终止指定进程:k
    保存文件:W
排序:
    P:以占据的CPU百分比,%CPU
    M:占据内存百分比,%MEM
    T:累积占据CPU时长,TIME+
    首部信息显示:
    uptime信息:l命令
    tasks及cpu信息:t命令
    cpu分别显示:1 (数字)
    memory信息:m命令

1.1.5 htop

加强版top
启动选项
    -d #: 指定延迟时间;
    -u UserName: 仅显示指定用户的进程
    -s COLUME: 以指定字段进行排序
使用
	s:跟踪选定进程的系统调用
    l:显示选定进程打开的文件列表
    a:将选定的进程绑定至某指定CPU核心
    t:显示进程树

1.1.6 pstree

功能: 可以用来显示进程的父子关系,以树形结构显示
常用选项:
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高亮显示指定进程及其父进程

1.1.7 lsof

功能:查看进程正在被打开的文件
选项:
-a:列出打开文件存在的进程
-c<进程名>:列出指定进程所打开的文件
-g:列出GID号进程详情
-d<文件号>:列出占用该文件号的进程
+d<目录>:列出目录下被打开的文件
+D<目录>:递归列出目录下被打开的文件
-n<目录>:列出使用NFS的文件
-i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件
-u:列出UID号进程详情
-h:显示帮助信息
-v:显示版本信息。
-n: 不反向解析网络名字
用法:
1、找回被误删除的文件
lsof |grep delete
ll /proc/上一步骤查到的进程号/fd(文件描述符)
cat /proc/进程号/fd/文件描述符 > 1.txt
2、查看那个进程在使用此文件
lsof /var/log/messages
3、指定进程号,查看其打开的文件
lsof -p 9527
4、查看指定程序打开的文件
lsof -c httpd
5、查看网络连接情况
lsof -i port
lsof -i@172.31.3.12
6、查看端口连接情况,通过参数-i:端口可以查看端口的占用情况,-i参数还有查看协议,ip的连接情况等
lsof -i :80 -n 
7、查看指定进程打开的网络连接,参数-i、-a、-p等,-i查看网络连接情况,-a查看存在的进程,-p指定进程
lsof -i –n -a -p 9527
8、查看指定状态的网络连接,-n:no host names, -P:no port names,-i TCP指定协议,-s指定协议状态通过多个参数可以清晰的查看网络连接情况、协议连接情况等
lsof -n -P -i TCP -s TCP:ESTABLISHED

1.2 CPU

1.2.1uptime

系统平均负载: 指在特定时间间隔内运行队列中的平均进程数
	通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
	比如机器拥有48核那么活动进程数不大于74为性能良好,超过240那么机器处于严重阻塞状态

1.3 内存

1.3.1 free

功能: 显示内存使用状态
# 清缓存
向/proc/sys/vm/drop_caches中写入相应的修改值,会清理缓存。建议先执行sync(sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)。执行echo 1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的
如果因为是应用有像内存泄露、溢出的问题时,从swap的使用情况是可以比较快速可以判断的,但通过执行free 反而比较难查看。但核心并不会因为内存泄露等问题并没有快速清空buffer或cache(默认值是0),生产也不应该随便去改变此值。
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的。当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。

1.3.2 pmap

查看进程中那个程序用了多少内存,观察内存中某个程序是否异常

1.3.3 strace

跟踪某个命令执行过程干了什么

1.3.4 ltrace

跟踪某一进程库调用关系

1.3.5 vmstat

功能: 虚拟内存使用情况
说明:
procs:
 r:可运行(正运行或等待运行)进程的个数,和核心数有关
 b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
 swpd: 交换内存的使用总量
 free:空闲物理内存总量
 buffer:用于buffer的内存总量
 cache:用于cache的内存总量
swap: # 以内存为参照物
 si:从磁盘交换进内存的数据速率(kb/s)
 so:从内存交换至磁盘的数据速率(kb/s)
io:# 以内存为参照物
 bi:从块设备读入数据到系统的速率(kb/s)
 bo: 保存数据至块设备的速率
system:
 in: interrupts 中断速率,包括时钟
 cs: context switch     进程切换速率
cpu:
 us: 用户使用cpu时间
 sy: 内核使用cpu时间
 id: cpu空闲时间
 wa: io等待时间
 st: 虚拟机本身所使用内存时间

1.4 磁盘

1.4.1 iostat

查看磁盘的读写情况

1.4.2 iotop

可以查看进程的I/O

1.5 网络

1.5.1 iftop

查看主机的网络负载情况
测试 ping -f -s 65536 ip 产生大量流量

1.5.2 nload

查看网络吞吐量 

1.5.3 iptraf-ng

图形化界面查看网络流量

1.6 综合统计工具

1.6.1 dstat

查看系统资源统计

1.6.2 glances

综合监控工具支持cs架构
s glances -s
c glances -c ip

1.6.3 webmin

1.6.4 perf

1.6.4.1 工具功能

# 性能分析
# 系统监控
# 问题定位

1.6.4.2 工具组件

事件:通常是一个性能度量,由程序,用户,硬件等产生,可以用来进行监控,统计,分析
计数器: 记录事件
命令行工具:
数据存储:perf数据以特定格式存储,使用report命令读取
分析器: 核心组件对收集的数据进行分析并生成详细报告,揭示系统的性能瓶颈和优化点

1.6.4.3 基本用法

# perf list
使用 perf list 命令可以查看系统中可用的perf事件列表。这些事件包括硬件事件、软件事件和内核跟踪点等。通过这些事件,用户可以选择要监控的性能指标
# perf stat
perf stat 命令用于收集和显示性能计数器统计信息。它可以针对整个系统或特定进程收集数据,并显示事件的发生次数、占比等信息。

1.6.4.4 相关类型工具

gprof:GNU编译器集合中的性能分析工具,主要用于分析程序的函数调用关系和执行时间。
Valgrind:一款内存调试和性能分析工具,可以检测内存泄漏、缓存未命中等问题。
SystemTap:一款跟踪和分析内核及用户空间程序的工具,通过脚本语言编写性能探针。
OProfile:一款系统范围的性能分析工具,支持采样分析和基于硬件性能计数器的分析。

2、性能优化

2.1 cpu绑定

问题:cpu本身具有缓存,运行进程时需要加载进程的数据到缓存中,cpu切换会带来i/o成本
功能:减少cpu频繁切换带来的性能损失
命令:
	临时: taskset

2.2 调整进程优先级

命令:nice

2.3 优化iptables规则

iptables规则默认从上而下依次匹配,可以合并重复的规则或者更换为ipvs

2.4 禁止ping本主机

iptables -I INPUT 3 -p icmp -s 192.168.52.11 --icmp-type 8	-j REJECT

2.5 tcp参数优化

net.ipv4.tcp_fin_timeout = 2 # 表示套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认值是60秒。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_fin_timeout 60
net.ipv4.tcp_tw_reuse = 1 # 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认值为0,表示关闭。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_reuse 0
net.ipv4.tcp_tw_recycle = 1 # 表示开启TCP连接中TIME-WAIT sockets的快速回收。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle,默认为0,表示关闭。 提示:reuse和recycle这两个参数是为防止生产环境下服务器time_wait网络状态数量过多设置的。
net.ipv4.tcp_syncookies = 1 # 表示开启SYN Cookies功能。当出现SYN等待队列溢出时,启用Cookies来处理,可防范少量SYN攻击,这个参数也可以不添加。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syncookies,默认值为1 
net.ipv4.tcp_keepalive_time = 600 # 表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,建议改为10分钟。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_keepalive_time,默认为7200秒
net.ipv4.ip_local_port_range = 2000 65000 # 该选项用来设定允许系统打开的端口范围,即用于向外连接的端口范围。 该参数对应系统路径为:/proc/sys/net/ipv4/ip_local_port_range 32768 61000
net.ipv4.tcp_max_syn_backlog = 16384 # 表示SYN队列的长度,即半连接队列长度,默认为1024,建议加大队列的长度为8192或更多,这样可以容纳更多等待连接的网络连接数。 该参数为服务器端用于记录那些尚未收到客户端确认信息的连接请求最大值。 该参数对象系统路径为:/proc/sys/net/ipv4/tcp_max_syn_backlog
net.ipv4.tcp_max_tw_buckets = 36000 # 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数值,TIME_WAIT套接字将立刻被清除并打印警告信息。 默认为180000,对于Apache、Nginx等服务器来说可以将其调低一点,如改为5000~30000,不通业务的服务器也可以给大一点,比如LVS、Squid。 此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_tw_buckets
net.ipv4.route.gc_timeout = 100 
net.ipv4.tcp_syn_retries = 1 # 参数的值决定了内核放弃连接之前发送SYN+ACK包的数量。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_synack_retries,默认值为5
net.ipv4.tcp_synack_retries = 1	# 表示在内核放弃建立连接之前发送SYN包的数量。 该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syn_retries,默认值为6
net.ipv4.tcp_max_orphans = 16384  # 用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。 如果超过这个数值,孤立连接将被立即被复位并打印出警告信息。 这个限制只有为了防止简单的DoS攻击。不能过分依靠这个限制甚至认为减少这个值,更多的情况是增加这个值。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_orphans ,默认值8192
net.core.somaxconn = 16384 # 同时发起的TCP的最大连接数,即全连接队列长度,在高并发请求中,可能会导致链接超时或重传,一般结合并发请求数来调大此值。 该参数对应系统路径为:/proc/sys/net/core/somaxconn ,默认值是128
net.core.netdev_max_backlog = 16384 # 表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包最大数。 该参数对应系统路径为:/proc/sys/net/core/netdev_max_backlog,默认值为1000
posted on 2023-09-11 15:36  要快乐不要emo  阅读(64)  评论(0)    收藏  举报