# 《Seckill秒杀系统》第123章:单机服务性能极致优化

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:对单机服务进行优化,掌握单机服务优化的方向和优化方式,重点掌握最佳线程数优化、Tomcat优化、RPC框架优化、JVM优化和静态资源优化,并能够结合自身实际项目思考,将对单机服务的极致优化灵活应用到自身实际项目中。

大家好,我是冰河~~

在专栏前面的文章中,我们已经对秒杀系统的源码进行了相应的优化,并且通过对秒杀系统的全链路压测,我们对秒杀系统的整体性能瓶颈有了初步的了解。随后,对服务器物理机进行了优化,接下来,还需要对单机服务进行优化。

# 一、前言

系统优化不仅仅是优化系统本身的代码,还需要对代码运行的硬件环境、软件环境等进行优化,只有系统本身,与其依赖的硬件环境和软件环境的性能,综合达到了最优,整个秒杀系统才会达到最优的性能。在前面的文章中,我们已经对秒杀系统进行了各种优化措施,接下来,对于秒杀系统运行在单机服务器或容器上的服务进行优化。

# 二、本章诉求

对秒杀系统运行在单机服务器或容器上的服务进行优化,重点掌握:确认最佳线程数、Tomcat优化、RPC框架优化、JVM优化和静态资源优化,并能够将这些优化措施灵活应用到自身实际项目中。

# 三、确认最佳线程数

到底需要为线程池分配多少线程数,其实是需要根据多线程具体的应用场景来确定的。一般情况下,可以将程序分为CPU密集型程序和IO密集型程序,而对于这两种密集型程序来说,计算最佳线程数的方法是不同的。

# 3.1 CPU密集型程序

对于CPU密集型程序来说,多线程重在尽可能多的利用CPU的资源来处理任务。 所以,对于CPU密集型程序来说,理论上“线程的数量=CPU核数”是最合适的。但是在实际工作中,一般会将线程数量设置为“CPU核数+1”,这是为了防止因出现意外情况导致线程阻塞。如果某个线程因意外情况阻塞,则多出来的线程会继续执行任务,从而保证CPU的利用效率。

因此,在CPU密集型的程序中,一般可以将线程数设置为CPU核数+1。

# 3.2 IO密集型程序

对于IO密集型程序来说,如果某个线程在执行IO操作时,另外的线程恰好执行完CPU计算任务,此时CPU能够达到最佳的利用效率。所以,在IO密集型程序中,理论上最佳的线程数与程序中IO操作的耗时和CPU计算的耗时的比值相关。

在单核CPU下,理论上最佳的线程数 = 1 + (IO操作的耗时 / CPU计算的耗时)

在多核CPU下,理论上最佳的线程数 = CPU核数 * [ 1 + (IO操作的耗时 / CPU计算的耗时) ]。

注意:通过上述方式计算出的线程数只是理论上的最佳数量,在实际工作中,还是需要通过对系统不断的进行压测,根据压测的结果数据来找到最佳的线程数。

# 四、Tomcat优化

对于Tomcat的优化,主要从Tomcat工作模式和配置两方面进行。

# 4.1 Tomcat工作模式

Tomcat主要有四种工作模式,分别为:BIO、NIO、NIO2和APR,具体如下所示。

工作模式 协议类 说明
BIO org.apache.coyote.http11.Http11Protocol 阻塞模式,Tomcat8.5.x以后不再支持。
NIO org.apache.coyote.http11.Http11NioProtocol 非阻塞模式,比阻塞模式有较大的性能提升。
NIO2 org.apache.coyote.http11.Http11Nio2Protocol 异步非阻塞模式,读取网络数据不再等待,完成会执行回调操作。
APR org.apache.coyote.http11.Http11AprProtocol 需要单独安装Tomcat Native工具,从操作系统级别来解决异步的IO问题,大幅度的提高性能,并且对静态文件和SSL的处理性能比较高。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码