1. Linux性能监控与调优工具
除了保证程序的正确性以外,在项目开发中往往还关心性能和稳定性。我们往往要对内核、应用程序或整个系统进行性能优化。在性能优化中常用的手段如下:
使用top、vmstat、iostat、sysctl等常用工具
top命令用于显示处理器的活动状况。在缺省情况下,显示占用CPU最多的任务,并且每隔5s做一次刷新;vmstat命令用于报告关于内核线程、虚拟内存、磁盘、陷阱和CPU活动的统计信息;iostat命令用于分析各个磁盘的传输闲忙状况;netstat是用来检测网络信息的工具; sar用于收集、报告或者保存系统活动信息,其中,sar用于显示数据,sar1和sar2用于收集和保存数据
sysctl是一个可用于改变正在运行中的Linux系统的接口。用sysctl 可以读取几白个以上的系统变量,如用sysctl—a可读取所有变量。
sysctl的实现原理是:所有的内核参数在/proc/sys中形成一个树状结构,sysctl系统调用的内核函数是sys_sysctl,匹配项目后,最后的读写在do_sysctl_strategy中完成。
2.使用高级分析手段,如OProfile、gprof
OProfile可以帮助用户识别诸如模块的占用时间、循环的展开、高速缓存的使用率低、低效的类型转换和冗余操作、错误预测转移等问题。它收集有关处理器事件的信息,其中包括TLB的故障、停机、存储器访问以及缓存命中和未命中的指令的攫取数量。OProfile支持两种采样方式:基于事件的采样(Event Based)和基于时间的采样(Time Based)。基于事件的采样是OProfile只记录特定事件(比如L2缓存未命中)的发生次数,当达到用户设定的定值时Oprofile就记录一下(采一个样)。这种方式需要CPU内部有性能计数器(Performace Counter))。基于时间的采样是OProfile借助OS时钟中断的机制,在每个时钟中断,OProfile都会记录一次(采一次样)。引入它的目的在于,提供对没有性能计数器的CPU的支持,其精度相对于基于事件的采样要低,因为要借助OS时钟中断的支持,对于禁用中断的代码,OProfile不能对其进行分析。
2. Linux上TCP的几个内核参数调优
Linux作为强大操作系统提供了丰富的内核参数进行调优,TCP内核参数调优尤其重要。本文聚焦于内网环境下的TCP参数调优,分享一些实践经验。
调优清单包括:tcp_max_syn_backlog、somaxconn、tcp_abort_on_overflow。这三个参数关联内核TCP连接缓冲队列,设定过小可能导致连接被无端丢弃,引起诡异现象,建议增大Backlog队列大小以避免问题。
设置tcp_abort_on_overflow可避免连接被意外丢弃。同时,确保Java应用正确配置Backlog参数,避免默认值过小导致连接问题。
考虑tcp_tw_recycle参数可能带来的负面影响,如NAT环境下连接成功率降低。高版本内核已优化此参数,如遇TIME_WAIT问题,调整相关参数可缓解。
优化tcp_syn_retries参数,设置合适的重传次数以改善连接建立时的超时时间。Java应用通常可通过API设置超时时间,降低依赖于内核参数的重要性。
调整tcp_retries2参数,用于计算传输过程中的重传次数,对特定场景如长ReadTimeout设置有显著影响。优化此参数可减少宕机时的响应延迟,但资源隔离策略也是关键。
在物理机宕机与进程宕机情形下,内核行为存在差异。物理机宕机会导致内核发送reset,减轻线程阻塞问题。
考虑tcp_slow_start_after_idle参数,Linux默认开启。关闭此参数可提高某些请求的传输速度,适用于网络条件变化频繁的场景。在内网系统间调用中,通常无需启用此功能。
初始CWND大小对请求速率有显著影响。Linux 2.6.32及以前版本初始CWND为(2-4)个mss,现代版本调整为RFC 6928推荐的10段,即14K左右,更适合内网环境。
总之,Linux内核提供丰富参数供调优,选择最适合当前环境的组合至关重要。潜心研究,找到最佳实践,可显著提升系统性能。