【IO的概述】
计算机中的IO,主要是本地磁盘IO和网络IO。
下面是关于IO速度的几个基本知识。
网络IO肯定是本地最快,局域网次之,跨机房、跨城市、跨运营商会变慢。
局域网的传输速度比SSD卡的随机读取速度快,比普通硬盘就快更多了。
【关于磁盘】
对于高并发和高性能的系统,什么时候会用磁盘呢?
毕竟磁盘速度相对来说太慢了。
磁盘的优点:
空间大,价格低廉,持久化数据更安全。
磁盘的缺点:
读取、写入速度都比较慢,并发能力弱。
我们看到上面的优点和缺点,系统各方面权衡考虑的话,如果对空间要求高(几百G),可能不得不用磁盘来做存储。
如果对持久稳定的要求更高的话,磁盘可靠性也比内存要好。
所以,当我们需要大量空间来做缓存,比如:
1 nginx缓存一个网站上万的页面,还是用磁盘缓存吧。
2 搜索结果缓存,可能32G、64G还是会不够用,那么也可以考虑用磁盘来做一个备用缓存,至少会比从数据库或者其他系统中检索要快。
或者我们需要有更大空间来保存或者持久化必须的数据,比如:
1 数据库索引,索引太多,还是需要用到磁盘来做保存。
2 长期的数据文件。
如果对性能要求高,尽量用SSD,至少在数据库服务器和缓存服务器,还是用SSD磁盘吧。
【关于网络】
下面是用户访问网站应用的一个典型的网络架构。
数据库服务器/缓存服务器/接口服务器
这里的几个网络速度会有明显差别。
1 “WIFI/4G”,因为用户可能在深圳,WEB服务器在北京,这样跨城市甚至跨运营商请求,速度是很慢的。
2 “跨机房”请求后端的数据库服务器/缓存服务器/接口服务器,网络相对于局域网就差了至少一个数量级。
关于第一种慢(用户到服务器),用户到WEB服务器,有几个方法可以优化:
1 CDN网络,让末端服务器节点离用户更近(缺点,实时性更新很难保证,数据一致性也就很难做到);
2 多机房部署,多城市、多线路的服务器部署和网络接入(缺点,部署和维护代价、要求高,系统的复杂度更高);
关于第二种慢(服务器跨机房请求),应用服务器跨机房请求,有几个方法可以优化:
1 同机房部署,避免跨机房请求(缺点,部署和维护代价、要求高,数据一致性和同步的难度更高);
2 跨机房之间的网络拉专线光纤(缺点,成本高);
从上面可以看到,对于中小型网站部署多机房还是不多,但是对于大型网站和应用,即使缺点也很明显,但也不得不投入去做。
【应用和程序优化】
上面的网络架构中,我们讲了网速慢的时候怎么优化网络架构,还有另外关于应用和系统的优化问题。
用户到WEB服务器的数量多,而且网络慢,意味着WEB服务器需要同时持有很多连接,要有更高的并发能力才行。
如果应用服务器以及后端的数据库、接口等性能跟不上,同样会造成请求拥堵。
所以这里就有了对系统的高并发和高性能要求。
支持高并发的WEB服务器,现在大部分用nginx,原因就是它高效的网络处理,内存占用少,可以同时连接几十万上百万请求。
为什么nginx可以做到2.5M内存保持1万连接,简单说,就是它把请求放到操作系统的网络事件队列中(epoll模型),不会为每个请求开一个线程,也不会自己去轮询所有连接。
而到开发语言的层面,JAVA有netty,PHP有swoole,这些框架都是可以更好的支持IO密集型服务。
支持高性能,就需要每一个技术人员不断对系统做优化和改造了,而且,这是一个长期漫长的过程,也是一个需要不懈努力的过程。
但是很多时候,应用运行时间越长,性能反而越差了,因为业务不断改动需求,因为数据不断积累,所以,这也是对技术提出了更高的要求。
几个通用的优化思路:
1 多关注业务逻辑,能否减少计算次数,能否简化资源依赖?
2 数据结构是否更高效,避免过多的再次加工处理;
3 数据库使用效率是否高效,数据表设计,索引设计是否合理?
4 Web调优,PHP设置,JVM设置。
【总结】
1 为了高性能,尽量少用磁盘,一定要用的话就上SSD吧。
2 多机房部署,多线接入,应用、数据库等同机房部署,避免跨城市、跨运营商、跨机房请求。
3 对于IO密集型的WEB服务器,支持多路复用的网络模型(epoll)会是更优的选择。
4 性能优化是长期而且跟业务紧密相关的问题,也是技术成长的必经之路。
在实战课程 《PHP秒杀系统 高并发高性能的极致挑战》中,也是针对这类高并发的业务场景做了特定的性能优化以及分布式方案,大家可以参考学习。