bios整体配置
bios系统设置Hyper Thread开启超线程,设置后lscpu命令Thread(s) per core 值显示为 2。超线程可以理解为CPU的虚拟化,一颗物理CPU并行执行两条流水线指令。确认处理器基本频率及睿频频率,部分处理器基础频率低,但是睿频不低。
内核引导参数
内核引导参数大体上可以分为两类:一类与设备无关,另一类与设备有关。
idle参数
调整CPU运行频率及状态,减少低功耗状态。需要修改内核状态参数idle,如下:
idle=poll
idle=halt
idle=nomwait
对CPU进入休眠状态的额外设置。
poll:从根本上禁用休眠功能(也就是禁止进入C-states状态),可以略微提升CPU性能,功耗也较高;
halt:直接使用HALT指令让CPU进入C1/C1E休眠状态,但是不再继续进入C2/C3以及更深的休眠状态。属于综合状态,CPU唤醒速度快,功耗略微降低。
nomwait :进入休眠状态时禁止使用CPU的MWAIT指令。MWAIT是专用于Intel超线程技术的线程同步指令,可以提升CPU的超线程效能。
isolcpus
isolcpus=<CPU编号列表>
将列表中的CPU从内核SMP平衡和调度算法中剔除,该参数的主要用于实现特定cpu只运行特定进程的目的。当然剔除后并不是绝对不能再使用该CPU,仍然可以通过task_set指定特定的进程使用哪个CPU。
查看核心是否被过滤的命令:taskset -pc 1
调节tuned模式
tuned-adm active
tunning作为一个守护进程,监视网卡、磁盘、内存、CPU等接口状态,并提供了高吞吐、低时延、禁止大页等模式供选择,省的用户到处修改配置文件。
turbostat -n 1
监测cpu的工作频率,确认cpu是否处于C0满速运行状态。
关闭无关的防火墙配置,减少多余性能损耗。
Iptables、firewalld
关闭selinux模块(用于控制访问权限的模块)
上述内核参数修改之后需要reboot重启才能生效。
numa
将应用程序绑定在网卡对应的numa上,使用lspci查看目标网卡在哪颗CPU对应的PCI卡槽上,使用lscpu查看物理CPU对应的逻辑cpu node节点号。
使用taskset查看所有cpu核心,排除cpu被过滤的影响;使用numactl --cpunodebind=0 --localalloc .exec 启动应用;然后使用top查看idle值确认绑定效果。
系统性能测试摸底
用unixbench、sysbench跑跑系统分,如果是数据库服务器,推荐使用sysbench。
用iperf,qperf测网卡时延带宽及吞吐量。
用nmom工具查看是否有频繁的内存页换入换出pageout及cache miss,根据测试结果对应调整应用程序的资源分配。
性能测试之前清一下缓存,保证实验环境干净,减少干扰分析因素:
echo 3 > /proc/sys/vm/drop_caches
观察内存分配变化,如果波动较大,使用top -2监控CPU占用是否存在多应用程序争抢资源的问题。
网卡性能
对于多核CPU服务器,如果把硬件中断分配给不同的CPU (core) 处理能有更好的平衡性能。如果让网卡中断/磁盘IO中断独占1个CPU (core)的话可以提高整体处理效率,减少数据跨核传输。网卡中断绑核过程为:关闭中断,直接将网卡绑定到指定CPU上,不让IRQ balance服务分配。
绑核之后使用cat proc/interrupts 查看应用绑定的CPU对应的网卡中断是否符合预期,检查对应的numa节点其不同CPU核中断分配是否均衡。
Irq balance的工作过程:
/proc/stat获取每个cpu的负载情况,/proc/interrupts获取每个节点的中断负载情况。得到每个节点的负载以及每个中断的负载之后,需要找到负载较高的节点,把该节点的中断从节点中移动到其他的节点来平衡每个cpu的中断。
手工绑定中断亲和关系,可以配置一个中断号和多个CPU绑定:
/proc/irq/{IRQ_ID}/smp_affinity
echo 11 > /proc/irq/24/smp_affinity
RSS网卡多队列技术
支持RSS(Receive Side Scaling)的网卡,通过多队列技术,每个队列对应一个中断号,通过对每个中断的绑定,可以实现网卡中断在CPU多核上的分配。当网卡收到数据包时会产生中断,通知内核有新数据包,然后内核调用中断处理程序进行处理,把数据包从网卡缓存拷贝到内存,因为网卡缓存大小有限,如果不及时拷出数据,后续数据包将会因为缓存溢出被丢弃。通过多队列网卡驱动的支持,将各个队列通过中断绑定到不同的CPU核上,以满足网卡的需求。网卡消息积压一点点,应用时延会成指数级变化,因此RSS特性可以极大提高应用处理阈值。
RPS/RFS
在不支持RSS的环境中,RPS/RFS提供了软件上的替代方案。RPS(Receive Packet Steering)是把一个rx队列的软中断分发到多个CPU核上,从而达到负载均衡的目的。RFS(Receive Flow Steering)是RPS的扩展,RPS只依靠hash来控制数据包,提供负载平衡,没有考虑到应用程序的位置(应用程序所在CPU)。RFS目标是通过指派应用线程正在运行的CPU处理中断,增加数据缓存的命中率。
开启方式:
# echo 7 > /sys/class/net/eth0/queues/rx-0/rps_cpus
#开启rps,16进制7代表二进制111,对应CPU0-2
此时软中断基本分配到CPU0-2
nmap/os_scan扫描
nmap不止是漏洞探测器或安全扫描器,其还有一个核心功能是操作系统侦测,包括识别出操作系统类型、版本号、目标机硬件平台类型及附加信息(如TCP序号产生方式、IPID产生方式、启动时间等)。
应用crash异常分析
windows服务器可以使用windbg工具分析,linux服务器使用pstack导出进程堆栈,通过堆栈查看waitlock等关键字确定死锁线程,通过bt找到死锁线程等待的锁对象,通过lockowner持有该锁的线程,分析该线程堆栈即可找到死锁原因。通常情况下,是该线程持有多个同步资源(锁),并且被abort了,一般出在异常退出onError处理不完善,网络断开重连导致资源状态脏等场景。