一、先搞懂:HTTPS为啥会吃垮CPU?
很多做后端开发、运维的朋友应该都遇过这种糟心事:网站流量一上来,反向代理服务器的CPU直接飘满,一查监控,全是HTTPS加解密占的坑。尤其是那种需要反向代理做HTTPS终结的场景——比如用户的HTTPS请求先到Nginx,Nginx解密后再转发给后面的业务服务器,这中间的解密操作,简直是CPU的“吞金兽”。
为啥这么费CPU?得说透底层逻辑:HTTPS用的是TLS协议,整个握手过程有两步核心操作都特别吃算力。第一步是“非对称加密协商密钥”,比如RSA算法,要算大质数的乘方、模运算,这个过程CPU得掰扯半天;第二步是“对称加密传输数据”,虽然比第一步省点力,但如果流量大、请求多,累积起来也是个天文数字。
举个最常见的例子:如果你的网站每天有100万次HTTPS请求,每次握手的RSA运算要占CPU 1微秒(实际可能更久),那一天光握手的CPU时间就有100万*1微秒=1000秒,相当于一个CPU核心连续跑16分钟。要是流量翻10倍,那就是160分钟,直接把核心占满。
而且反向代理的HTTPS终结,是把所有用户的加解密压力都集中到自己身上,不像浏览器或业务服务器分散处理。这种“单点算力集中”的特性,让CPU瓶颈特别容易出现。
二、方案一:用硬件加速卡把加解密从CPU手里抢过来
既然CPU不擅长做加解密,那有没有专门干这个的硬件?还真有,就是“硬件加速卡”,也叫TLS加速卡、SSL加速卡。它的原理特别好理解:就像你家里有个专门的烤箱,专门烤面包,比用微波炉烤快多了——加速卡就是专门做TLS加解密的“硬件烤箱”,把原来CPU要干的重活,全甩给它。
2.1 硬件加速卡的核心逻辑
加速卡的核心是自带的专用芯片,比如ASIC(专用集成电路),这种芯片天生就是为TLS加解密设计的,算力比CPU强几十上百倍,而且功耗还低。你可以把它插在服务器的PCIe插槽里,然后让反向代理(比如Nginx)把加解密任务交给它,CPU只需要管调度、转发这些轻活。
2.2 具体怎么用?拿Nginx举例(技术栈:Nginx + Intel QAT加速卡)
这里用Intel的QAT加速卡(现在很多服务器主板都集成了QAT功能,不用单独买卡)来举例,配置特别简单。
首先得确认服务器支持QAT,然后安装QAT的驱动和Nginx的QAT模块:
# 安装QAT驱动(以CentOS为例)
yum install -y qatlib qatlib-devel
# 编译Nginx时加入QAT模块
./configure --with-http_ssl_module --with-qat --prefix=/usr/local/nginx
make && make install
然后修改Nginx的配置文件,让它用QAT加速HTTPS:
# Nginx HTTPS配置,启用QAT加速
server {
listen 443 ssl;
server_name example.com;
# 加载QAT加速模块(核心配置)
ssl_engine qat;
# 其他常规配置
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
location / {
proxy_pass http://backend_server;
}
}
配置完重启Nginx,你会发现CPU占用率直接降下来,HTTPS的处理速度快很多。比如原来每秒能处理1000次HTTPS请求,用了QAT后可能能到10000次,提升特别明显。
2.3 硬件加速卡的优缺点
优点特别突出:一是性能提升幅度大,尤其是高并发场景,能解决CPU瓶颈;二是释放CPU资源,让CPU能去处理其他更重要的任务,比如业务逻辑、数据库查询;三是稳定性好,加速卡专门干这个,不容易出问题。
缺点也有:一是成本,独立的QAT加速卡价格不便宜,集成的虽然便宜但对服务器型号有要求;二是兼容性,不是所有反向代理都支持所有加速卡,比如有些老版本的Nginx就不支持新的QAT模块;三是维护麻烦,驱动、模块升级都得跟着服务器硬件走,一旦出问题排查起来比纯软件复杂。
2.4 注意事项
用硬件加速卡的时候,有几个坑得避开:一是要选对适配自己服务器的加速卡,比如服务器是PCIe 3.0的,就别买PCIe 4.0的,插上去用不了;二是要确保反向代理的版本支持加速模块,比如Nginx得用1.18以上的版本才支持QAT;三是测试的时候要模拟真实流量,别只测小流量,大流量下才能看出效果。
三、方案二:用异步模式让CPU“一心二用”
如果不想花钱买硬件,有没有软件层面的办法?有,就是“异步模式”。它的原理也特别好懂:原来CPU处理HTTPS的时候,是“串行”的——先解密一个请求,解密完再处理下一个,中间CPU只能干等着;而异步模式是“并行”的——CPU先给第一个请求安排解密,然后转去处理第二个请求的其他任务,等第一个请求解密完了再回来处理剩下的。这样CPU就不会闲等着,利用率大大提高。
3.1 异步模式的核心逻辑
异步模式的核心是“事件驱动”和“非阻塞IO”。比如Nginx本身就是事件驱动的服务器,原来的同步模式下,CPU处理一个HTTPS请求的流程是:接收请求→解密→转发→等待响应→加密→返回响应,每一步都要等上一步完成才能继续;而异步模式下,CPU把解密任务交给专门的线程池,自己去处理其他请求,等解密完成后再通过事件通知CPU继续后续流程。
3.2 具体怎么用?拿Nginx举例(技术栈:Nginx 异步HTTPS模块)
Nginx从1.15版本开始支持异步SSL,配置起来特别简单,不需要额外装硬件。
修改Nginx的配置文件,启用异步SSL:
# Nginx HTTPS配置,启用异步SSL
server {
listen 443 ssl;
server_name example.com;
# 启用异步SSL(核心配置)
ssl_async on;
# 其他常规配置
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
location / {
proxy_pass http://backend_server;
}
}
配置完重启Nginx,你会发现CPU的利用率更合理,不会再出现“一个核心占满,其他核心闲得慌”的情况。比如原来一个核心处理HTTPS的时候,其他核心只能干等着,现在所有核心都能参与处理,整体的吞吐量能提升30%-50%。
3.3 异步模式的优缺点
优点是:一是成本低,不需要额外买硬件,只需要升级反向代理版本就行;二是兼容性好,只要反向代理支持异步模块,所有服务器都能用;三是维护简单,和原来的反向代理配置差不多,出问题容易排查。
缺点是:一是性能提升幅度不如硬件加速卡,尤其是超高并发场景,还是会出现CPU瓶颈;二是对反向代理的版本有要求,比如Nginx得用1.15以上的版本;三是需要合理配置线程池,要是线程池配置太小,反而会降低性能。
3.4 注意事项
用异步模式的时候,有几个坑得避开:一是要升级反向代理到支持异步的版本,比如Nginx得用1.15以上的版本;二是要合理配置线程池的大小,一般线程池的大小和CPU核心数差不多就行,太大了会导致线程切换频繁,反而降低性能;三是测试的时候要模拟真实的并发流量,比如用ab、wrk工具压测,看看吞吐量和延迟的变化。
四、两种方案的适用场景对比
很多朋友会问,到底选硬件加速卡还是异步模式?其实得看自己的业务场景。
如果是高并发、大流量的场景,比如电商网站、直播平台,每天有几百万甚至几千万次HTTPS请求,那优先选硬件加速卡。因为这种场景下,CPU瓶颈特别明显,硬件加速卡能带来几十倍的性能提升,虽然成本高,但能解决根本问题。
如果是中低并发、预算有限的场景,比如中小企业的官网、内部管理系统,每天只有几万到几十万次HTTPS请求,那选异步模式就行。因为这种场景下,CPU瓶颈不明显,异步模式能提升30%-50%的性能,足够用了,而且成本低、维护简单。
还有一种情况,就是两种方案结合用。比如先开异步模式,再用硬件加速卡,这样能把性能提升到最大。比如原来每秒能处理1000次HTTPS请求,结合用了之后可能能到15000次,提升特别明显。
五、总结
HTTPS加解密消耗CPU资源,是反向代理服务器最常见的性能瓶颈之一。解决这个问题,主要有两种方案:硬件加速卡和异步模式。
硬件加速卡是专门为TLS加解密设计的硬件,性能提升幅度大,适合高并发、大流量的场景,但成本高、兼容性差;异步模式是软件层面的优化,成本低、兼容性好,适合中低并发、预算有限的场景。
不管选哪种方案,都要根据自己的业务场景来决定,而且都要经过充分的测试,确保能解决问题。比如在测试的时候,要模拟真实的流量,看看CPU占用率、吞吐量、延迟这些指标的变化,确保方案能达到预期的效果。
最后还要提醒大家,除了这两种方案,还有一些其他的优化手段,比如优化SSL会话缓存、使用更高效的加密算法(比如TLS 1.3),这些手段也能降低CPU的消耗,大家可以结合起来用,效果会更好。
评论
围绕“反向代理终结HTTPS时频繁的加解密处理严重消耗CPU资源,如何利用硬件加速卡或异步模式降低性能损耗提升吞吐能力”参与讨论