性能问题的定位

线上程序常出现的状况是运行一段时间之后, 发现运行效率越来越差, 慢慢出现了累计或者相应慢的情况, 比较粗暴额解决方式是重启程序, 一切都正常了。 但是过了一段时间问题又出现了, 我们需要借助一些工具来定位为。
通常我们的程序, 可以大致分为3种类型:

  • 计算型, cpu、 内存使用比较多, 比如我们常见的缓存, 计算型流失数据分析等;
  • 存储型, 磁盘IO使用比较多,通常的瓶颈在磁盘IO,比如数据库存储引擎, 存储系统等;
  • 网络资源消耗性, 比如网络库。

top

出现性能问题, 第一个能想到的就是用top来看下系统各个进程的cpu, 内存状况是否异常。一般CPU的使用率超出了预期的太多, 意味着程序没有合理利用CPU, 太低说明了程序没有充分发挥CPU的功能, 要么是并发没有做好, 一般是加锁太多或者不合理造成的;
另外一个方面就是内存的使用量, 物理内存是有限的, 一个进程使用了过多的内存, 必然导致其他的进程内存不足, 内存不足会加速数据页在磁盘和内存之间的交换, 甚至使用SWAP内存, 性能会大大下降;另外, 要通过进程的监控程序, 看一下内存是否在持续的增长, 如果是, 可能有了内存泄漏, 内存泄漏也是导致程序变慢的常见问题。

iotop, vmstat

现在的机器, 磁盘空间一般不是什么大的问题, 然而, 对于大数据而言, 磁盘IO, 尤其是系统盘的IO, 常常造成性能问题。
使用iostat来确认是否有某个盘的读写IO非常高的状况:

iostat: 显示一个cpu和磁盘的状态信息;
iostat -d 2: 连续的显示以2秒为间隔的报告信息;
iostat -d 2 6: 显示6个以2秒为间隔的报告信息;
iostat -x sda sdb 2 6: 显示磁盘sda, sdb的6个以2秒为间隔的报告信息;

如果有, 可以通过iotop来找到具体哪一个进程导致的io问题, 它显示的第一列就是进程id, 有时候我们该进程是某个脚本里面启动的一个进程, 还可以通过ps -ef找到该进程的父进程, 然后定位到相应的程序。

iftop, netstat

一般的网络性能问题,首先查看机器的网络流量历史, 看下是不是某段时间流量徒增, 超过了网络带宽, 这种情况下可以通过调整机器硬件的方法解决;
还可以通过iftop来定位当前的网络流量状态, 它可以显示机器与其他主机之间的网络流量,如果某个连接的流量非常高, 就需要分析一下相应的连接。
通过netstat来统计当前的各种TCP状态的数量:

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

可以得到各种状态的数目, 我们通常比较关心的是TIME_WAIT和CLOSE_WAIT的个数,具体的TCP状态可以参考这里: TCP状态图, 可以调整内科参数来解决:

  • net.ipv4.tcp_syncookies = 1:表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

  • net.ipv4.tcp_tw_reuse = 1: 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

  • net.ipv4.tcp_tw_recycle = 1: 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值