浅谈服务器性能测试的全生命周期—从测试、结果分析到优化策略

发表于:2016-6-28 11:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:WeTest Micheal    来源:51Testing软件测试网采编

分享:
  4. 服务器的性能优化
  在优化之前,先要搞清楚服务器的具体业务需求是什么,据此来优化其中的短板。
  4.1.  存储的优化
  IO相对来说比较耗时,我们都知道越靠近CPU的存储,其访问速度越快,但是其价格越贵。下图来展示了不同存储的容量以及访问时间。
  目前很多同学在优化服务器性能的时候都会从存储这方面入手。
  储存的容量以及访问时间
  4.1.1.   用内存换时间
  4.1.1.1. 增加缓存
  很多web应用是有大量的静态内容,这些静态内容主要都是一些小文件,并且会被频繁的读,采用Apache以及nginx作为web服务器。在web访问量不大的时候,这两个http服务器可以说是非常的迅速和高效,如果负载量很大的时候,我们可以采用在前端搭建cache服务器,将服务器中的静态资源文件缓存到操作系统内存中直接进行读操作,因为直接从内存读取数据的速度要远大于从硬盘读取。这个其实也是增加内存的成本来降低访问磁盘带来的时间消耗。
  4.1.1.2. 内存数据库
  内存数据库,其实就是将数据放在内存中直接操作的数据库。相对于磁盘,内存的数据读写速度要高出几个数量级,将数据保存在内存中相比从磁盘上访问能够极大地提高应用的性能。内存数据库抛弃了磁盘数据管理的传统方式,基于全部数据都在内存中重新设计了体系结构,并且在数据缓存、快速算法、并行操作方面也进行了相应的改进,所以数据处理速度比传统数据库的数据处理速度要快很多。但是安全性的问题可以说是内存数据库最大的硬伤。因为内存本身有掉电丢失的天然缺陷,因此我们在使用内存数据库的时候,通常需要,提前对内存上的数据采取一些保护机制,比如备份,记录日志,热备或集群,与磁盘数据库同步等方式。
  对于一些重要性不高但是又想要快速响应用户请求的部分数据可以考虑内存数据库来存储,同时可以定期把数据固化到磁盘。
  4.1.1.3. RDD
  这里图个新鲜,说说内存换时间在大数据云计算相关领域的一些应用。Spark最近很火,它的核心要数RDD了,RDD最早来源与Berkeley实验室的一篇论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。现有的数据流系统对两种应用的处理并不高效:一是迭代式算法,这在图应用和机器学习领域很常见;二是交互式数据挖掘工具。这两种情况下,将数据保存在内存中能够极大地提高性能。这里不详细说RDD了,只是想说程序员一直是觊觎内存的读取速度的。
  4.1.2.   使用SSD等
  除了对内存方面的优化,还可以对磁盘这边进行优化。跟传统机械硬盘相比,固态硬盘具有快速读写、质量轻、能耗低以及体积小等特点。但是ssd的价格相比传统机械硬盘要贵,有条件的可以使用ssd来代替机械硬盘。
  4.2.  数据库优化
  大部分的服务器请求最终都是要落到数据库中,随着数据量的增加,数据库的访问速度也会越来越慢。想要提升请求处理速度,必须要对原来的单表进行动刀了。目前主流的Linux服务器使用的数据库要属mysql了,如果我们使用mysql存储的数据单个表的记录达到千万级别的话,查询速度会很慢的。根据业务上合适的规则对数据库进行分区分表,可以有效提高数据库的访问速度,提升服务器的整体性能。
  另外对于业务上查询请求,在建表的时候可以根据相关需求设置索引等,以提高查询速度。
  4.3.  利用多核优势
  现在运行服务器的主流机器配置都是多核CPU的,我们在设计服务器的时候可以利用多核心的特点,采用多进程或者多线程的框架。
  关于选择多线程还是多进程可以根据实际的需求,结合各自的优缺点进行选择。
  对于多线程的使用,特别是使用线程池的时候可以通过测试不同线程池服务器的性能来设置合适的线程池。
  4.4.  选择合适的IO模型
  《UNIX网络编程卷1:套接字联网API》中有一幅图比较经典。
  
IO模型
  阻塞I/O模型:数据没到达之前,I/O一直阻塞,如果数据到达,则会返回。典型的是recvfrom,一般的默认都是阻塞的。
  非阻塞的I/O模型:和阻塞相反,只要不能得到结果的时候,I/O立刻返回。不会阻塞当前线程。IO复用模型:也就是自己要学习的部分。多路复用的意思是,将多路信号合并到一路上进行处理,类似多个管道汇集到一个管道,与之相反的是多路分解。IO复用模型主要是select,poll,epoll;对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听;函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。信号驱动:首先开启套接口信号驱动I/O功能,并通过系统调用sigaction安装一个信号处理函数。当数据报准备好被读时,就为该进程生成一个SIGIO信号。随即可以在信号处理程序中调用recvfrom来读数据报,井通知主循环数据已准备好被处理中。也可以通知主循环,让它来读数据报。异步的IO模型:告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核拷贝到用户自己的缓冲区)通知我们。
  这里并不是说一定要用某个模型,epoll也并不是在所有情况下都比select性能要好的,在选择的时候还是要结合业务需求来。
  4.5.  分布式部署程序
  当单机服务器已经找不到合适的优化点时,我们可以通过分布式部署来提高服务器的响应能力。优秀的服务器开发都会为自己的服务器的扩容,容灾提出一些解决方案。个人觉得服务器设计的时候简单点比较好,这样后期扩容的时候会很方便。
  总结
  服务器性能测试是一项比较繁琐的事情,作为没有做过性能测试的同学需要事先了解服务器的协议是如何定义的,建立框架管理机器人、统计测试中机器人收到回包的结果以及压测过程中各项性能数据的变化。在完成了测试的过程后,可以从硬件、操作系统以及应用程序等多个方面进行对性能结果进行定位。最后在明确业务需求的前提下,通过存储优化、数据库优化以及分布式部署程序等手段完成服务器的性能优化。
版权声明:本文出自腾讯WeTest Micheal,51Testing软件测试网原创出品,未经明确的书面许可,任何人或单位不得对本文进行复制、转载或镜像,否则将追究法律责任。
33/3<123
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号