在优化之前,先要搞清楚服务器的具体业务需求是什么,据此来优化其中的短板。
4.1. 存储的优化
IO相对来说比较耗时,我们都知道越靠近CPU的存储,其访问速度越快,但是其价格越贵。下图来展示了不同存储的容量以及访问时间。
目前很多同学在优化服务器性能的时候都会从存储这方面入手。
储存的容量以及访问时间
4.1.1. 用内存换时间
很多web应用是有大量的静态内容,这些静态内容主要都是一些小文件,并且会被频繁的读,采用Apache以及nginx作为web服务器。在web访问量不大的时候,这两个http服务器可以说是非常的迅速和高效,如果负载量很大的时候,我们可以采用在前端搭建cache服务器,将服务器中的静态资源文件缓存到操作系统内存中直接进行读操作,因为直接从内存读取数据的速度要远大于从硬盘读取。这个其实也是增加内存的成本来降低访问磁盘带来的时间消耗。
对于一些重要性不高但是又想要快速响应用户请求的部分数据可以考虑内存数据库来存储,同时可以定期把数据固化到磁盘。
这里图个新鲜,说说内存换时间在大数据云计算相关领域的一些应用。Spark最近很火,它的核心要数RDD了,RDD最早来源与Berkeley实验室的一篇论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。现有的数据流系统对两种应用的处理并不高效:一是迭代式算法,这在图应用和机器学习领域很常见;二是交互式数据挖掘工具。这两种情况下,将数据保存在内存中能够极大地提高性能。这里不详细说RDD了,只是想说程序员一直是觊觎内存的读取速度的。
除了对内存方面的优化,还可以对磁盘这边进行优化。跟传统机械硬盘相比,固态硬盘具有快速读写、质量轻、能耗低以及体积小等特点。但是ssd的价格相比传统机械硬盘要贵,有条件的可以使用ssd来代替机械硬盘。
另外对于业务上查询请求,在建表的时候可以根据相关需求设置索引等,以提高查询速度。
4.3. 利用多核优势
现在运行服务器的主流机器配置都是多核CPU的,我们在设计服务器的时候可以利用多核心的特点,采用多进程或者多线程的框架。
对于多线程的使用,特别是使用线程池的时候可以通过测试不同线程池服务器的性能来设置合适的线程池。
4.4. 选择合适的IO模型
《UNIX网络编程卷1:套接字联网API》中有一幅图比较经典。
IO模型
这里并不是说一定要用某个模型,epoll也并不是在所有情况下都比select性能要好的,在选择的时候还是要结合业务需求来。
4.5. 分布式部署程序
当单机服务器已经找不到合适的优化点时,我们可以通过分布式部署来提高服务器的响应能力。优秀的服务器开发都会为自己的服务器的扩容,容灾提出一些解决方案。个人觉得服务器设计的时候简单点比较好,这样后期扩容的时候会很方便。
服务器性能测试是一项比较繁琐的事情,作为没有做过性能测试的同学需要事先了解服务器的协议是如何定义的,建立框架管理机器人、统计测试中机器人收到回包的结果以及压测过程中各项性能数据的变化。在完成了测试的过程后,可以从硬件、操作系统以及应用程序等多个方面进行对性能结果进行定位。最后在明确业务需求的前提下,通过存储优化、数据库优化以及分布式部署程序等手段完成服务器的性能优化。
联系客服