[ 知识是人生的灯塔只有不断学习才能照亮前行的道路 ] 大家好我是 WeiyiGeek一名深耕安全运维开发SecOpsDev领域的技术从业者致力于探索DevOps与安全的融合DevSecOps自动化运维工具开发与实践企业网络安全防护欢迎各位道友一起学习交流、一起进步 若此文对你有帮助一定记得点个关注⭐与小红星❤️或加入到作者知识星球『 全栈工程师修炼指南』转发收藏学习不迷路 。1.2 内存层面优化在 Nginx 中每连接分配8KB或数十KB内存空间但实际使用率低导致并发连接数受限另有由于受到 NUMA 架构影响Node 访问远端内存时延迟升高从而降低整体内存访问速度。此外进程在不同CPU核心间频繁迁移也会导致内存的L1/L2/L3缓存命中率下降需绑定进程至固定CPU以提升缓存利用率所以在 Nginx 配置中可通过worker_cpu_affinity等指令绑定进程至固定CPU核心, 从而提升缓存命中率。另外也将相关常用数据连接通过内存进行缓存以减少磁盘I/O提升性能。温馨提示若文章代码块中存在乱码或不能复制请联系作者也可通过文末的阅读原文链接加入知识星球中阅读原文链接https://articles.zsxq.com/id_i1qqni3rce3f.html优化指南TLS/SSL 握手性能优化指令当 Nginx 配置了TLS/SSL协议则在握手阶段会产生额外的CPU和带宽消耗可通过 Nginx 提供的SSL会话缓存session cache指令ssl_session_cache开启会话缓存减少握手消耗指令语法如下# 配置SSL会话缓存session cache Syntax: ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; Default: ssl_session_cache none; Context: http, server # 参数说明 off禁用且向客户端明示 none: 禁用但不通知客户端 builtin: 使用 OpenSSL 内存级缓存仅同 worker 进程复用, 非 Nginx 提供的共享内存 shared:name:size: 基于共享内存的全局缓存定义命名共享内存区域以及缓存大小1MB缓存约支持4000个会话通常设置为 10M (常用) # 示例 ssl_session_cache builtin:1000 shared:SSL:10m;另外一种方式便是使用 TLS/SSL 中的会话票证session tickets其机制是服务端将会话密钥加密后生成 tickets 发送至客户端客户端后续握手携带 tickets服务端解密成功即复用会话跳过非对称加密。主要适用于 NGINX 集群环境使得在多台 Nginx 中可以反复的使用其会话票据依赖统一密钥通过 ssl_session_ticket_key 配置但存在安全风险需定期轮换密钥否则长期密钥泄露将导致历史流量被解密。# 配置是否开启会话票据session tickets Syntax: ssl_session_tickets on | off; Default: ssl_session_tickets on; Context: http, server # 配置会话票据密钥 Syntax: ssl_session_ticket_key file; Default: — Context: http, server # 例如使用 openss 命令创建一个文件包含80或48字节的随机数据其中包含用于加密和解密TLS会话票证的密钥 openssl rand -out ticket.key 80使用 Google TCMalloc 优化内存分配及性能分析在 Linux 中默认 glibc malloc (GDB malloc通常作为一个单独的 PTMalloc2 包提供) 内存分配能力不足成为 Nginx 极致性能的瓶颈某些特殊场景因此可以使用 Google 的 TCMalloc (Thread-Caching Malloc) 替代其特点是减少内存碎片、擅长小内存管理、减少多线程间锁竞争提升分配效率尤其在高并发场景下表现突出。TCMalloc为每个线程分配一个线程本地缓存, 小的分配由线程本地缓存满足对象根据需要从中央数据结构移动到线程本地缓存中并且定期的垃圾收集用于将内存从线程本地缓存迁移回中央数据结构。TCMalloc 处理大小 32K的对象“小”对象与处理较大对象的方式不同。大型对象使用页面级分配器直接从中央堆分配页面是4K对齐的内存区域。即大对象总是页面对齐的并且占据整数个页面, 一系列的页面可以被分割成一系列的小对象每个对象的大小相等。例如一个页面4K的运行可以划分为32个大小为128字节的对象。weiyigeek.top-TCMalloc overview图由 TCMalloc 页面可查看到其与PTMalloc2单元性能测试数据与分析结果。测试环境与对象RedHat 9 Linux glibc-2.3.2 超线程的 2.4GHz 双Xeon系统首先对于不同数量的线程 TCMalloc 与 (Glic) PTMalloc 2每秒运行的总操作数百万与最大分配大小结果如下图所示。• 单线程性能对比从128B起性能明显提升峰值约提升1倍32KB后提升趋缓。纵轴: 分配/释放对象大小64B → 128KB 横轴mops/cpu second 指 CPU 在一秒内能够完成的百万次操作数量它是一个衡量处理器综合处理能力的指标涵盖了计算、寻址、数据传输等多种类型的操作。 其中虚线PT malloc为 glibc 默认分配器实线TC malloc为 Google 提供的 TCMalloc。• 多线程扩展性对比: 在线程数递增1→3→4→5→8→12→16→20的情况下小对象2KB场景下TCMalloc 优势随线程数增加急剧扩大在 20 线程时小块内存分配吞吐量差距极为显著。weiyigeek.top-不同数量的线程性能对比图还可从另外一个维度针对固定大小的字节数我们做分配释放内存的时候我们采用不同的线程数例如对于64节的时候这种小块内存我们只要增加线程并发数那么它的性能一定是比 Glibc 越来越好的。纵轴: 线程数 0→20。 横轴: CPU 在一秒内能够完成的百万次操作数量• 64B小块线程数增加TCMalloc性能持续远超glibc• 1KB仍有明显优势• 4KB优势减弱• ≥32KB单线程基本持平多线程仍保持可观差距• 64KB/128KBTCMalloc 仍具性能提升整体值得采用weiyigeek.top-不同固定大小的字节数性对比图想要了解更多 TCMalloc 介绍说明的小伙伴们可访问 Google TCMalloc 官方文档 或 https://cloud.tencent.com.cn/developer/article/2064566 查看学习。先在问题来了如何获取 TCMalloc 库以及如何集成在 Nginx 呢?步骤 01访问 Github 中 google/gperftools 仓库从 README 文档中可知如果要使用 TCmalloc只需通过-ltcmalloc链接器标志将tcmalloc链接到您的应用程序或者使用$ LD_PRELOAD/usr/lib/libtcmalloc.so方式不推荐另外如果您更愿意链接到不包含堆分析器和检查器的TCMalloc版本可能是为了减少静态二进制文件的二进制文件大小则可以链接到libtcmalloc_minimal。Just linkin -ltcmalloc or -ltcmalloc_minimal to get the advantages of tcmalloc -- a replacement for malloc and new. See below for some environment variables you can use with tcmalloc, as well. tcmalloc functionality is available on all systems weve tested; see INSTALL for more details. See README_windows.txt for instructions on using tcmalloc on Windows.步骤 02进入 Releases 下载最新的 gperftools 源码包编译安装 TCMalloc 动态/静态库温馨提示作者在 OpenEuler 24.04 环境下实践的。# 方式1 wget /https://github.com/gperftools/gperftools/releases/download/gperftools-2.18.1/gperftools-2.18.1.tar.gz tar -zxvf gperftools-2.18.1.tar.gz -C /usr/local/src cd /usr/local/src/gperftools-2.18.1 ./configure --prefix/usr/local/gperftools/tcmalloc make -j$(nproc) make install # 方式2 # 支持 autoconf 以及 cmake的构建方式所以采用 cmake 来构建 # wget https://down.wygk.eu.org/https://github.com/gperftools/gperftools/archive/refs/tags/gperftools-2.18.1.tar.gz # tar -zxvf gperftools-2.18.1.tar.gz -C /usr/local/src # cd /usr/local/src/gperftools-gperftools-2.18.1 # mkdir build cd build # cmake -DCMAKE_INSTALL_PREFIX/usr/local/bin/ .. # make -j$(nproc) make installweiyigeek.top-编译安装 gperftools 图步骤 03.查看编译安装产物找到 libtcmalloc.so 动态库文件路径至此我们得到了 tcmalloc 库$ find /usr/local/gperftools/tcmalloc -name libtcmalloc.* /usr/local/gperftools/tcmalloc/lib/libtcmalloc.so /usr/local/gperftools/tcmalloc/lib/libtcmalloc.so.4.6.5 /usr/local/gperftools/tcmalloc/lib/libtcmalloc.la /usr/local/gperftools/tcmalloc/lib/libtcmalloc.so.4 /usr/local/gperftools/tcmalloc/lib/libtcmalloc.a /usr/local/gperftools/tcmalloc/lib/pkgconfig/libtcmalloc.pc步骤 04.为了让运行时的程序能找到这个库需要将库路径添加到 /etc/ld.so.conf.d/ 中并刷新缓存如果看到如下图中所示的libtcmalloc.so.4的路径信息说明添加成功。# 1. 创建配置文件如果文件不存在 echo/usr/local/gperftools/tcmalloc/lib | sudotee /etc/ld.so.conf.d/gperftools.conf # 2. 刷新动态链接库缓存 sudo ldconfig # 3. 验证是否生效 ldconfig -p | grep tcmallocweiyigeek.top-将 gperftools 相关lib库加入到系统图步骤 04.编译 Nginx 源码加入编译--with-ld-opt-L/usr/local/gperftools/tcmalloc/lib -ltcmalloc --with-google_perftools_module选项参数集成 TCMalloc 库。./configure --prefix/usr/local/nginx --usernginx --groupnginx --sbin-path/usr/sbin/nginx --conf-path/usr/local/nginx/conf/nginx.conf --pid-path/usr/local/nginx/nginx.pid --error-log-path/var/log/nginx/logs/error.log --http-log-path/var/log/nginx/logs/access.log --lock-path/var/run/nginx.lock --modules-path/usr/local/nginx/modules --with-http_stub_status_module --with-http_realip_module --with-http_v2_module --with-http_ssl_module --with-http_slice_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt-O2 --with-compat --with-debug --with-ld-opt-L/usr/local/gperftools/tcmalloc/lib -ltcmalloc --with-google_perftools_module make -j$(nproc) make install特别注意在 C 语言生成可执行文件的两个步骤编译与链接此外必须显式指定链接TCMalloc库若缺失则TCMalloc完全不生效若 TCMalloc安装路径非标准需用-L指定其lib目录位置例如--with-ld-opt-L/usr/local/lib -ltcmalloc• 编译阶段通过--with-cc-opt传递编译器选项• 链接阶段通过--with-ld-opt传递链接器选项。至此Nginx 二进制文件将动态链接 libtcmalloc.so.4 使之接入 TCmalloc 内存分配优化工具运行时所有malloc/free调用由 TCMalloc 接管实现高并发小内存极致性能。步骤 05.使用 Google Perftools 工具对 Nginx Worker 进程进行性能分析前面我们已经在编译 Nginx 时已经集成了 ngx_google_perftools_module 模块它以 profile 方式分析程序中消耗执行时间最多的函数在生产环境中需针对高耗时函数及其所属功能模块进行针对性优化。语法参数• google_perftools_profiles 设置一个文件名该文件用于保存 NGINX worker 进程的性能分析信息worker 进程的 ID 始终是文件名的一部分并附加在文件名的末尾在点号之后。Syntax: google_perftools_profiles path; Default: — Context: main # 示例 vim nginx.conf main { ... google_perftools_profiles /tmp/nginx_tcmalloc; ... } # 结果/tmp/nginx_tcmalloc.worker_pidweiyigeek.top-启用google_perftools_profiles图温馨提示生成的 profile 文件需要借助 pprof 工具进行分析。什么是 pprof 工具pprof 是 Google 提供的一个profiling功能用于可视化和程序性能分析数据的工具它可以帮助开发者理解程序的性能瓶颈和内存使用情况。通过 pprof你可以生成各种视图如文本、图形等来展示程序中的函数调用关系和时间消耗, 可快速定位应用程序中的性能瓶颈不仅限于 Nginx还可用于其他语言编写的应用程序。特别注意由于 gperftools 最新的源码中不再提供 pprof 工具网上大多数教程都在通过 gperftools 2.7 源码来编译放在当下已经过时了所以需要通过其他方式安装 pprof 工具例如操作系统包管理器安装 pprof 以及 go 安装 pprof然后使用pprof分析生成的 profile 文件。# 由于 pprof 图形化展示依赖于 graphviz 和 libunwind 库源码所以需要安装这两个依赖包。 yum install go libunwind graphviz # https://github.com/libunwind/libunwind # 安装 pprof 工具 $ go install github.com/google/pproflatest # 查看 pprof 工具安装路径 $ echo$GOPATH /root/go/ $ ls$GOPATH/bin/ pprof # 创建软连接 ln -s $GOPATH/bin/pprof /usr/local/bin/ # 查看帮助文档 $ pprof --help usage: # 以指定格式生成输出。 # format可以是以下之一--text 文本 / --pdf 图形 pprof format [options] [binary] source ... # 使用其命令的交互式shell生成配置文件的各种视图 pprof [options] [binary] source ... # 提供“-http”标志以在指定的host:port处获得交互式web界面该界面可用于浏览配置文件的各种视图。 pprof -http [host]:[port] [options] [binary] source ...步骤 06.配置验证完成后重新启动 Nginx 服务将会生成多个nginx_tcmalloc.work 进程id文件此时文件大小为 0 Byte在访问 nginx 站点页面后例如之前文章中测速 http2 主动推送的站点示例 https://server.weiyigeek.top/video.html然后再重启 Nginx 服务此时文件将不再时 0 Byte然后使用pprof工具在 OpenRestyNginx中分析函数执行时间的 profiling 能力依据函数耗时数值判定优化优先级并验证模块使用正确性。$ nginx -s stop $ nginx $ find /tmp/ -name nginx_tcmalloc.* -size 1k -execls -alh {} \; -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056558 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056559 -rw-rw-rw- 1 nginx nginx 8.4K Mar 17 12:11 /tmp/nginx_tcmalloc.4056560 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056561 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056562 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056563 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056564 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056565 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056566 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056567 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056568 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056569 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056570 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056572 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056571 -rw-rw-rw- 1 nginx nginx 7.6K Mar 17 12:10 /tmp/nginx_tcmalloc.4056573 # 使用 pprof 以文本格式分析一个最大的 profile 文件 pprof --text /tmp/nginx_tcmalloc.4056560 File: nginx Type: cpu # 采样总量非常小仅 40ms这意味着这可能是一个极短时间的采样或者程序压力并不大。 Showing nodes accounting for 40ms, 100% of 40ms total flat flat% sum% cum cum% 20ms 50.00% 50.00% 20ms 50.00% write 10ms 25.00% 75.00% 10ms 25.00% CRYPTO_gcm128_release 10ms 25.00% 100% 10ms 25.00% [libcrypto.so.3.0.12] 0 0% 100% 10ms 25.00% CRYPTO_gcm128_encrypt_ctr32 0 0% 100% 10ms 25.00% EVP_EncryptUpdate 0 0% 100% 20ms 50.00% SSL_rstate_string 0 0% 100% 20ms 50.00% SSL_write 0 0% 100% 10ms 25.00% X509_get0_reject_objects 0 0% 100% 10ms 25.00% [libssl.so.3.0.12] 0 0% 100% 40ms 100% __libc_init_first 0 0% 100% 40ms 100% __libc_start_main 0 0% 100% 40ms 100% _start 0 0% 100% 40ms 100% main 0 0% 100% 40ms 100% ngx_event_process_posted 0 0% 100% 40ms 100% ngx_http_copy_filter 0 0% 100% 40ms 100% ngx_http_output_filter 0 0% 100% 40ms 100% ngx_http_request_handler 0 0% 100% 40ms 100% ngx_http_v2_filter_send (inline) 0 0% 100% 40ms 100% ngx_http_v2_send_chain 0 0% 100% 40ms 100% ngx_http_v2_send_output_queue 0 0% 100% 40ms 100% ngx_http_write_filter 0 0% 100% 40ms 100% ngx_http_writer 0 0% 100% 20ms 50.00% ngx_log_error_core 0 0% 100% 40ms 100% ngx_master_process_cycle 0 0% 100% 40ms 100% ngx_output_chain 0 0% 100% 40ms 100% ngx_spawn_process 0 0% 100% 40ms 100% ngx_ssl_send_chain 0 0% 100% 30ms 75.00% ngx_ssl_write (inline) 0 0% 100% 30ms 75.00% ngx_ssl_write.part.0 0 0% 100% 40ms 100% ngx_start_worker_processes 0 0% 100% 40ms 100% ngx_worker_process_cycle 0 0% 100% 20ms 50.00% ngx_write_fd (inline) # 指标含义 flat(Flat Time) : 函数自身执行消耗的时间不包括它调用的子函数。 flat%(Flat Percent) : 该函数自身耗时占总采样时间例如40ms的百分比。 sum%(Sum Percent) : 当前行及上方所有行 flat% 的累加值。用来快速查看前几名消耗了多少比例。 cum(Cumulative Time) : 累积耗时。该函数自身耗时 它调用的所有子函数耗时的总和。 cum%(Cumulative Percent) : 累积耗时占总时间的百分比。 founction name : 函数名如果是内联函数inline则会显示在括号中。weiyigeek.top-Nginx进程采样分析图步骤 07.之前的 40ms 采样时间太短无法代表真实负载现在通过压力测试工具如 wrk 或 ab进行压测 60 秒并使用 pprof 生成在线火焰图查看热点函数执行调用情况如下所示# 压力测试 # 400 并发连接持续 60s 压力测试12个线程平均每个线程处理 约33-34个连接。 $ wrk -t12 -c400 -d60s https://server.weiyigeek.top/video.html Running 1m test https://server.weiyigeek.top/video.html 12 threads and 400 connections Thread Stats Avg Stdev Max /- Stdev Latency 65.41ms 42.19ms 618.03ms 73.91% Req/Sec 523.55 140.16 1.69k 60.85% 373582 requests in 1.00m, 441.78MB read Requests/sec: 6216.72 Transfer/sec: 7.35MB # 重新加载 Nginx 配置将分析结果写入文件 $ nginx -s reload # 查看生成的 profile 采样文件 find /tmp/ -name nginx_tcmalloc.* -size 100k -execls -alh {} \; -rw-rw-rw- 1 nginx nginx 148K Mar 17 13:23 /tmp/nginx_tcmalloc.4065265 -rw-rw-rw- 1 nginx nginx 184K Mar 17 13:23 /tmp/nginx_tcmalloc.4065266 .... # 直接生成交互式 Web 页面推荐 pprof -http10.20.172.214:8008 /tmp/nginx_tcmalloc.4065266 # 或者生成pdf文件 pprof --pdf -output nginx_tcmalloc.pdf /tmp/nginx_tcmalloc.4065266 Generating report in nginx_tcmalloc.pdfweiyigeek.top-flamegraph火焰图还可选择 view 点击 graph 查看到具体的调用链信息亦可分析 Nginx 模块函数的加载顺序加深对 Nginx 工作流程有更深的理解。weiyigeek.top-graph调用图总结本小节主要介绍 TCMalloc 相关知识其优于缺省的 glibc 内存分配器在海量高并发请求中频繁分配释放小内存如HTTP请求头、短生命周期 buffer时提供远超 glibc 的吞吐量与稳定性然后手动编译 perftools 源码生成 TCMalloc 动态和静态链接库并将 TCMalloc 添加编译进行 Nginx 中以进行内存分配最后通过ngx_google_perftools_module模块导出对 Nginx Worker 进程进行性能分析文件之后使用 pprof 工具进行分析最后通过火焰图直观展示热点函数执行时间以助于可快速定位 OpenRestyNginx中的性能瓶颈。最后有需要新手朋友们可加入到作者知识星球中完整系统的学习 Nginx 高性能Web服务器从入门到生产时间后续也将持续更新 OpenResty 系列文章感谢大家支持。[Nginx | 核心知识150讲之基础介绍与进程信号管理学习笔记](https://articles.zsxq.com/id_1b7rrwwqo422.html)[Nginx | 核心知识150讲之事件驱动框架笔记](https://articles.zsxq.com/id_w52o5cd47zwi.html)[Nginx | 核心知识150讲之静态、动态模块编译使用笔记](https://articles.zsxq.com/id_dertjh0239h3.html)[Nginx | 核心知识150讲之连接池与内存池介绍笔记](https://articles.zsxq.com/id_wxgg5glpimm9.html)[Nginx | 核心知识150讲之常用容器类型介绍笔记](https://articles.zsxq.com/id_xnch5n50hm9j.html)[Nginx | 核心知识150讲之HTTP模块指令处理流程介绍笔记](https://articles.zsxq.com/id_4wfw412wei48.html)[Nginx | 核心知识150讲之处理请求的11个阶段与对应模块介绍笔记(上篇)](https://articles.zsxq.com/id_70wxcdwid00g.html)[Nginx | 核心知识150讲之处理请求的11个阶段与对应模块介绍笔记(下篇)](https://articles.zsxq.com/id_3dcvx6w81906.html)[Nginx | 核心知识150讲之变量介绍与实践应用笔记](https://articles.zsxq.com/id_rx229kjix356.html)[Nginx | 核心知识150讲之反向代理流程与负载均衡实践笔记](https://articles.zsxq.com/id_a2l6pacq0flr.html)[Nginx | 核心知识150讲之HTTP协议中反向代理学习实践笔记](https://articles.zsxq.com/id_fkims9wlo8ww.html)[Nginx | 核心知识150讲之SSL证书签发与HTTPS加密传输学习实践笔记](https://articles.zsxq.com/id_wwnjk3rmwroa.html)[Nginx | 核心知识150讲之前端静态缓存、反向代理动态缓存学习实践笔记](https://articles.zsxq.com/id_6hpaidhf5l5s.html)[Nginx | 核心知识150讲之其它HTTP框架下反向代理学习实践笔记](https://articles.zsxq.com/id_7wc0af7viwqr.html)[Nginx | 核心知识150讲之利用 open_file_cache 缓存文件句柄提升性能](https://articles.zsxq.com/id_19oatlbj0w64.html)[Nginx | 核心知识150讲之介绍使用 HTTP/2.0 协议实现资源主动推送](https://articles.zsxq.com/id_fib851xw86fq.html)[Nginx | 核心知识150讲之四层反向代理的七个阶段及对应模块浅析实践上](https://articles.zsxq.com/id_wtv12vsjglt0.html)[Nginx | 核心知识150讲之四层反向代理的七个阶段及对应模块浅析实践下](https://articles.zsxq.com/id_t5z28zcqv7us.html)[Nginx | 核心知识150讲之CPU层面性能优化指南](https://articles.zsxq.com/id_c5gt26jx4zcp.html)[Nginx | 核心知识150讲之内存层面性能优化指南](https://articles.zsxq.com/id_i1qqni3rce3f.html)[Nginx | 核心知识150讲之网络层面性能优化指南](https://articles.zsxq.com/id_q8wr9cv6ke27.html)[Nginx | 核心知识150讲之磁盘IO层面性能优化指南](https://articles.zsxq.com/id_713d6lwet0zc.html)END加入作者【全栈工程师修炼指南】知识星球『 全栈工程师修炼指南』星球主要涉及全栈工程师Full Stack Development实践文章持续更新包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生Cloud Native、物联网工业控制IOT、人工智能Ai从业书籍笔记人生职场认识等方面资料或文章。Q: 加入作者【全栈工程师修炼指南】星球后有啥好处✅ 将获得作者最新工作学习实践文章以及网盘资源。✅ 将获得作者珍藏多年的全栈学习笔记(需连续两年及以上老星球友也可单次购买)✅ 将获得作者专门答疑学习交流群解决在工作学习中的问题。✅ 将获得作者远程支持在作者能力范围内且合规。获取作者工作学习全栈笔记作者整理了10年的工作学习笔记涉及网络、安全、运维、开发需要学习实践笔记的看友可添加作者微信或者回复【工作学习实践笔记】当前价格299除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持希望大家多多支持收获定大于付出知识推荐往期文章【最新】Nginx | CPU 层面性能优化秘诀时间片拉满 内核级负载均衡让性能直接“狂飙”【最新】Nginx | CPU 层面性能优化秘诀Worker 进程绑定、减少上下文切换彻底榨干每一颗核心【最新】用 Nginx 做文件服务器大材小用试试 Dufs相当于给你的服务器装上“网盘搜索”【相关】Nginx | open_file_cache 功能实现解决频繁 open/close 的性能顽疾【相关】Nginx | HTTP 反向代理gRPC 高性能远程过程调用RPC框架【相关】Nginx | 核心知识150讲百万并发下性能优化之深挖十一个处理阶段对应模块指令实践上篇【相关】Nginx | 核心知识150讲百万并发下性能优化之深挖十一个处理阶段对应模块指令实践下篇若文章对你有帮助请将它转发给更多的看友若有疑问的小伙伴可在评论区留言你想法哟