本文节选自浅谈服务器性能测试的全生命周期——从测试、结果分析到优化策略
小白用户一个,前段时间自己选择云服务器时就面临了不知道选什么参数配置的问题,也不知道各个性能指标是怎样限制服务器性能的。觉得此文拿来做科普非常好,这里备忘一下。
如何选择硬件
硬件对服务器性能影响还是蛮大的,如果是土豪的话,可以直接买最好的。我们分析硬件主要是希望选择合适的配置,节约资源,避免出现高射炮打蚊子的情况。
CPU
在资金的充足下,一般来说CPU的数量越多,主频越高,那么服务器的性能也就会越好。在实际测试过程中,如果在大压力下持续观察CPU的使用率很低,那么CPU的资源基本上是可以满足服务器要求的。这样的情况其实是有点浪费CPU资源的,比较理想的情况是压力不大的时候CPU利用率比较低,压力上来之后CPU利用率保持在60%-70%。
大部分的CPU在同一时间内只能运行一个线程,但是超线程的处理器可以在同一个时间运行多个线程,我们可以利用处理前超线程特性提高系统性能。虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每个CPU都具有独立的资源。当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。
内存
内存的大小也是影响服务器性能的一个重要因素。内存太小,系统进程要被阻塞,应用程序会变得缓慢,甚至是失去响应;如果太大的话,也是造成一种浪费。Linux系统中采用物理内存和虚拟内存两种方式,使用虚拟内存可以缓解物理内存的不足,但是如果占用过多的虚拟内存的话,应用程序的性能会明显的下降。
网络带宽
网络带宽的大小限制了客户端与服务器交互的流量,相对其他硬件资源,网络带宽在价格上更贵。这需要我们合理预估服务器的可服务器能力,需要占用的带宽资源。
磁盘IO
目前磁盘都是机械方式运作的,主要体现在磁盘读写前寻找磁道的过程。磁盘自带的读写缓存大小,对于磁盘读写速度至关重要。读写速度快的磁盘,通常都带有较大的读写缓存。磁盘的寻道过程是机械方式,决定了其随机读写速度将明显低于顺序读写。在我们做系统设计和实现时,需要考虑到磁盘的这一特性。
操作系统及软件
版本
不同的操作系统在内核实现上可能各不相同,因而对运行在上面的应用程序来说可能影响比较大。
笔者并没有做过分析不同操作系统对服务器性能的影响,因为只用过Linux开发服务器程序。Linux操作系统在这十几年发展的异常迅猛,目前大部分的服务器都是运行在Linux操作系统上的。Linux目前具有最好的生态系统,服务器端的各种软件都为它而设计,默认都认为你是在 Linux 上跑,你要是整一个非 Linux 的服务器,你得有足够的心理准备,因为出现任何问题,你可能未必能找到能帮你解决问题的人。
参数配置
先说一个小故事。福特公司一套重要设备出现故障,找了很多人来维修,结果都没有维修好,没办法了,就在购买设备的英国公司高价聘请一位工程师过来维修,工程师来到之后,反复查找原因,最后在一个小零件上划了一条线,然后对旁边福特公司的人说,在划线的地方切掉就好了,果不其然,切掉之后故障真的解除了,按照合约,福特公司应支付公司一万美元,周围的人都唏嘘不已,感叹一条线就可以价值一万美元,工程师回答到:那条线只值一美元,而怎样找到那条线值9999美元。
我们在测试服务器的过程中,经常会遇到性能上不去。查看CPU,网络,IO消耗都挺低的,就是定位不到问题的原因。有经验的程序员可能会告诉你你把某个参数修改一下,立马性能噌噌噌上去了。比如mysql相关设置,系统文件描述符,缓冲区大小,time_wait快速回收设置等,甚至是线程池配置的线程个数也会对服务器的性能产生较大的影响。
关于数据库参数的设置,比如mysql的配置文件my.cnf文件中,修改不同的配置(比如innodb_flush_log_at_trx_commit 设置为0,1还是2 )可能会对数据库的读写性能影响很大。
应用程序本身实现
比如程序中需要频繁申请内存,使用bzero和memset对服务器性能影响差距可能会很大。
另外程序中的一些查询操作,采用不同的数据结构,可以实现时间和空间上的相互转化,从而影响服务器的性能。