nice-ni 耗光cpu
可以看到 低优先级的进程 暂用了比较高的CPU时间。
top 命令中可以看到 NI 为19, 其优先级最低 但是使用cpu 最高。
说明这个进程需要经行优化了,
通过gdb 发现此进程一直都在处理报文,写缓存。
由于使用了dpdk, 此进程用来接收dpdk的报文数据解析。此时流量大约3-5g。
报文量多。此处逻辑 需要调整。以及进程优先级也需要调整
顺便说一说 http server端的优化
- TCP的keepalive
维护与client的防火墙的活跃网络包
检测实际断掉的连接
net.ipv4.tcp_keepalive_time=7200 发送心跳周期
net.ipv4.tcp_keepalive_intvl=75 探测包发送间隔
net.ipv4.tcp_keepalive_probes=9 探测包重试次数
- 减少关闭连接的timewait
- fin_wait1状态
net.ipv4.tcp_orphan_retries=0 发送FIN报文的重试次数,0相当于8
- fin_wait2状态
net.ipv4.tcp_fin_timeout=60 保持在FIN_WAIT_2的状态时间
- time_wait状态
net.ipv4.tcp_tw_reuse=1 开启后client端仍可以使用处于TIME_WAIT的端口,由于时间戳的存在,操作系统可以设置net.ipv4.tcp_timestamps=1拒绝迟到的报文
net.ipv4.tcp_max_tw_buckets TIME_WAIT的连接数量
net.ipv4.tcp_tw_recycle=0 开启后client和server都可以使用TIME_WAIT的端口,无法避免报文延迟和重复造成的混乱
lingering延迟关闭TCP连接
当server主动关闭连接的时候,调用close状态,当client仍发送数据到缓冲区,服务仍会给client发送RST包关闭连接,导致了client收到了RST而忽略了http的response
server端的配置
lingering_close off为关闭,on为由server判断是否使用
lingering_time 30s 功能启用时,最长的读取用户内容的时长,到达后立刻关闭
lingering_timeout 5s 检测client是否仍有请求内容到达,若超时后扔没有数据到达,则立刻关闭连接
读写超时通过RST立刻释放连接,代替四次握手
- 应用层协议优化
TLS和SSL握手优化的ssl_session_cache off
off为不使用,http server告诉client不使用
none为不使用
builtin为使用,当一个client两次连接都命中一个worker才生效
shared:name:size为使用,定义共享内存
Ticket会话验证票证
http server 会将会话的session作为ticket加密发送给client,client下次发起TLS连接的带上ticket,由nginx解密验证恢复会话,但是这样破换了nginx的TSL/SSL的安全机制,有安全风险,需要经常更换
- HTTP长连接
可以减少握手次数,减少并发连接消耗服务器资源,降低TCP拥塞控制
- 压缩包体
google pertools分析nginx
gpertools
- 文本展示 pprof --text
- 图形展示 pprof --pdf 需要依赖graphviz和libunwind
文本结果
2 0.9% 51.3% 166 73.5% ngx_epoll_process_event
1 0.4% 96.5% 2 0.9% ngx_open_and_stat_file
每统计周期为10ms
- 当前函数执行总共花费的统计周期
- 当前函数执行时间的百分比
- 当前函数及其之前函数执行时间的百分比
- 当前函数及其所调用函数消耗的统计周期总和
- 当前函数及其所调用函数执行时间总和的百分比
- 函数名
stub_status模块监控
- Active connections 当前client与Nginx间的TCP连接数,等于Reading+Writing+Waiting
- accept 从nginx启动,与client建立的连接数
- handler 从nginx启动,处理过的client连接数,如果没有超出worker_connections,应该是与accept相同
- requests 从nginx启动,处理过的client请求数,由于keepalive,所以会大于handler
- Reading 正在读取HTTP请求头的连接总数,接收完Reading就是Writing状态了
- Writing 正在向Client发送响应的连接总数
- Waiting 当前空闲的keepalive数量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2019-09-09 内核协议栈 网络流程图以及基本数据结构