k8s服务优雅退出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s服务优雅退出相关的知识,希望对你有一定的参考价值。
参考技术A 部署预估服务,rollingUpdate,使用Jmeter一直发压力请求发现会有很多失败的请求
确认当前预估服务不支持优雅退出
当前light4j的版本是1.5.14
发现light4j从1.5.15开始支持graceful shutdown
https://github.com/networknt/light-4j/blob/master/server/src/main/java/com/networknt/server/Server.java
启动预估服务后,直接给java程序发SIGTERM信号,kill -SIGTERM JAVAPID,发现java程序能够优雅退出
但是通过RollingUpdate,发现java程序没有优雅退出
4.0 删除POD
4.1 POD进入Terminating状态
4.2 与此同时,k8s会将POD从对应的service删除
4.3 与此同时,有preStop hook的容器,会先执行preStop hook, 如果preStop hook的时间超出了Grace period,kubelet会发送SIGTERM
4.4 与此同时,没有preStop hook的容器,kubelet发送SIGTERM信号给启动进程
由于预估服务的镜像是通过bash script启动,而不是直接在Dockerfile里面执行java程序,由上面的知识可知,POD删除的时候,kubelet会发送SIGTERM信号给Bash Script进程。
现在会有一个问题,bash是不能传递信号的
所以需要在bash脚本里面捕获信号,并给java程序发SIGTERM信号
通过Bash Trap信号传递给JAVA进程后,发现RollingUpdate操作还是会有失败的请求,压测qps 500的时候,会有20个请求失败,表现为503, connect refuse
分析:
请求持续不断的过来,这个时候进程收到了SIGTERM信号后开始处理没有完成的请求,但是在切流量的过程中,就是kubelet发送SIGTERM信号和把POD从service拿掉的过程中,有一点请求漏过来了
所以需要确保切流量之后,进程收到SIGTERM之前,不要有流量进来。
加上lifecycle preStop
再次测试,RollingUpdate几次,发现没有失败的请求了
《Netty进阶之路》目录
第1章 Netty服务端意外退出案例 1
1.1 Netty服务端意外退出问题 1
1.1.1 Java Daemon线程简介 2
1.1.2 Netty服务端启动原理 4
1.1.3 如何防止Netty服务端意外退出 6
1.1.4 实际项目中的优化策略 8
1.2 Netty优雅退出机制 9
1.2.1 Java优雅退出机制 10
1.2.2 Java优雅退出的注意点 12
1.2.3 Netty优雅退出机制 14
1.2.4 Netty优雅退出原理和源码分析 15
1.2.5 Netty优雅退出的一些误区 20
1.3 总结 21
第2章 Netty客户端连接池资源泄漏案例 22
2.1 Netty连接池资源泄漏问题 22
2.1.1 连接池创建代码 23
2.1.2 内存溢出和线程膨胀 23
2.1.3 错用NIO编程模式 25
2.1.4 正确的连接池创建方式 26
2.1.5 并发安全和资源释放 28
2.2 Netty客户端创建机制 29
2.2.1 Java NIO客户端创建原理分析 29
2.2.2 Netty客户端创建原理分析 32
2.2.3 Bootstrap工具类源码分析 34
2.3 总结 36
第3章 Netty内存池泄漏疑云案例 37
3.1 Netty内存池泄漏问题 37
3.1.1 路由转发服务代码 38
3.1.2 响应消息内存释放玄机 39
3.1.3 采集堆内存快照分析 42
3.1.4 ByteBuf申请和释放的理解误区 45
3.2 Netty内存池工作机制 48
3.2.1 内存池的性能优势 48
3.2.2 内存池工作原理分析 51
3.2.3 内存池核心代码分析 54
3.3 总结 58
第4章 ByteBuf故障排查案例 59
4.1 HTTP协议栈ByteBuf使用问题 59
4.1.1 HTTP响应Body获取异常 59
4.1.2 ByteBuf非法引用问题 63
4.1.3 ByteBuf使用注意事项 66
4.2 Netty ByteBuf实现机制 67
4.2.1 Java原生ByteBuffer的局限性 67
4.2.2 Netty ByteBuf工作原理分析 67
4.2.3 ByteBuf引用计数器工作原理和源码分析 70
4.3 总结 73
第5章 Netty发送队列积压导致内存泄漏案例 74
5.1 Netty发送队列积压案例 74
5.1.1 高并发故障场景 74
5.1.2 内存泄漏原因分析 76
5.1.3 如何防止发送队列积压 78
5.1.4 其他可能导致发送队列积压的因素 80
5.2 Netty消息发送工作机制 82
5.2.1 WriteAndFlushTask原理和源码分析 83
5.2.2 ChannelOutboundBuffer原理和源码分析 86
5.2.3 消息发送源码分析 88
5.2.4 消息发送高低水位控制 94
5.3 总结 95
第6章 API网关高并发压测性能波动案例 96
6.1 高并发压测性能波动问题 96
6.1.1 故障场景模拟 96
6.1.2 性能波动原因定位 98
6.1.3 主动内存泄漏定位法 101
6.1.4 网关类产品的优化建议 102
6.2 Netty消息接入内存申请机制 102
6.2.1 消息接入的内存分配原理和源码分析 102
6.2.2 Netty ByteBuf的动态扩容原理和源码分析 107
6.3 总结 108
第7章 Netty ChannelHandler并发安全案例 109
7.1 Netty ChannelHandler并发安全问题 109
7.1.1 串行执行的ChannelHandler 110
7.1.2 跨链路共享的ChannelHandler 114
7.1.3 ChannelHandler的并发陷阱 116
7.2 Netty ChannelHandler工作机制 118
7.2.1 职责链ChannelPipeline原理和源码分析 118
7.2.2 用户自定义Event原理和源码分析 122
7.3 总结 123
第8章 车联网服务端接收不到车载终端消息案例 124
8.1 车联网服务端接收不到车载终端消息问题 124
8.1.1 故障现象 125
8.1.2 故障期线程堆栈快照分析 126
8.1.3 NioEventLoop线程防挂死策略 128
8.2 NioEventLoop线程工作机制 129
8.2.1 I/O读写操作原理和源码分析 130
8.2.2 异步任务执行原理和源码分析 133
8.2.3 定时任务执行原理和源码分析 135
8.2.4 Netty多线程最佳实践 137
8.3 总结 137
第9章 Netty 3.X版本升级案例 139
9.1 Netty 3.X的版本升级背景 139
9.1.1 被迫升级场景 140
9.1.2 升级不当遭遇各种问题 140
9.2 版本升级后数据被篡改问题 141
9.2.1 数据篡改原因分析 142
9.2.2 问题总结 143
9.3 升级后上下文丢失问题 143
9.3.1 上下文丢失原因分析 144
9.3.2 依赖第三方线程模型的思考 144
9.4 升级后应用遭遇性能下降问题 145
9.4.1 性能下降原因分析 145
9.4.2 性能优化建议 146
9.5 Netty线程模型变更分析 147
9.5.1 Netty 3.X版本线程模型 147
9.5.2 Netty 4.X版本线程模型 149
9.5.3 线程模型变化点源码分析 150
9.5.4 线程模型变化总结 152
9.6 总结 154
第10章 Netty并发失效导致性能下降案例 155
10.1 业务ChannelHandler无法并发执行问题 155
10.1.1 服务端并发设计相关代码分析 155
10.1.2 无法并行执行的EventExecutorGroup 159
10.1.3 并行执行优化策略和结果 161
10.2 Netty DefaultEventExecutor工作机制 163
10.2.1 DefaultEventExecutor原理和源码分析 164
10.2.2 业务线程池优化策略 165
10.2.3 Netty线程绑定机制原理和源码分析 168
10.3 总结 170
第11章 IoT百万长连接性能调优案例 171
11.1 海量长连接接入面临的挑战 171
11.1.1 IoT设备接入特点 172
11.1.2 IoT服务端性能优化场景 172
11.1.3 服务端面临的性能挑战 172
11.2 智能家居内存泄漏问题 173
11.2.1 服务端内存泄漏原因定位 173
11.2.2 问题背后的一些思考 174
11.3 操作系统参数调优 174
11.3.1 文件描述符 175
11.3.2 TCP/IP相关参数 175
11.3.3 多网卡队列和软中断 177
11.4 Netty性能调优 177
11.4.1 设置合理的线程数 177
11.4.2 心跳优化 180
11.4.3 接收和发送缓冲区调优 183
11.4.4 合理使用内存池 184
11.4.5 防止I/O线程被意外阻塞 185
11.4.6 I/O线程和业务线程分离 187
11.4.7 针对端侧并发连接数的流控 187
11.5 JVM相关性能优化 189
11.5.1 GC调优 189
11.5.2 其他优化手段 193
11.6 总结 193
第12章 静态检查修改不当引起性能下降案例 195
12.1 Edge Service性能严重下降问题 195
12.1.1 Edge Service热点代码分析 195
12.1.2 静态检查问题不是简单的一改了之 197
12.1.3 问题反思和改进 200
12.2 克隆和浅拷贝 201
12.2.1 浅拷贝存在的问题 201
12.2.2 Netty的对象拷贝实现策略 203
12.3 总结 204
第13章 Netty性能统计误区案例 205
13.1 时延毛刺排查相关问题 205
13.1.1 时延毛刺问题初步分析 205
13.1.2 服务调用链改进 207
13.1.3 都是同步思维惹的祸 208
13.1.4 正确的消息发送速度性能统计策略 209
13.1.5 常见的消息发送性能统计误区 212
13.2 Netty关键性能指标采集策略 212
13.2.1 Netty I/O线程池性能指标 213
13.2.2 Netty发送队列积压消息数 214
13.2.3 Netty消息读取速度性能统计 215
13.3 总结 215
第14章 gRPC的Netty HTTP/2实践案例 216
14.1 gRPC基础入门 216
14.1.1 RPC框架简介 216
14.1.2 当前主流的RPC框架 218
14.1.3 gRPC框架特点 218
14.1.4 为什么选择HTTP/2 219
14.2 gRPC Netty HTTP/2服务端工作机制 220
14.2.1 Netty HTTP/2服务端创建原理和源码分析 220
14.2.2 服务端接收HTTP/2请求消息原理和源码分析 224
14.2.3 服务端发送HTTP/2响应消息原理和源码分析 231
14.3 gRPC Netty HTTP/2客户端工作机制 234
14.3.1 Netty HTTP/2客户端创建原理和源码分析 235
14.3.2 客户端发送HTTP/2请求消息原理和源码分析 238
14.3.3 客户端接收HTTP/2响应消息原理和源码分析 242
14.4 gRPC消息序列化机制 243
14.4.1 Google Protobuf简介 243
14.4.2 消息的序列化原理和源码分析 244
14.4.3 消息的反序列化原理和源码分析 245
14.5 gRPC线程模型 246
14.5.1 服务端线程模型 246
14.5.2 客户端线程模型 247
14.5.3 线程模型总结 248
14.6 总结 249
第15章 Netty事件触发策略使用不当案例 250
15.1 channelReadComplete方法被调用多次问题 250
15.1.1 ChannelHandler调用问题 250
15.1.2 生产环境问题模拟重现 252
15.2 ChannelHandler使用的一些误区总结 255
15.2.1 channelReadComplete方法调用 255
15.2.2 ChannelHandler职责链调用 257
15.3 总结 258
第16章 Netty流量整形应用案例 259
16.1 Netty流量整形功能 259
16.1.1 通用的流量整形功能简介 260
16.1.2 Netty流量整形功能简介 260
16.2 Netty流量整形应用 261
16.2.1 流量整形示例代码 261
16.2.2 流量整形功能测试 263
16.3 Netty流量整形工作机制 264
16.3.1 流量整形工作原理和源码分析 264
16.3.2 并发编程在流量整形中的应用 271
16.3.3 使用流量整形的一些注意事项总结 274
16.4 总结 278
第17章 Netty SSL应用案例 279
17.1 Netty SSL功能简介 279
17.1.1 SSL安全特性 280
17.1.2 Netty SSL实现机制 281
17.2 Netty客户端SSL握手超时问题 282
17.2.1 握手超时原因定位 282
17.2.2 Netty SSL握手问题定位技巧 283
17.3 SSL握手性能问题 284
17.3.1 SSL握手性能热点分析 284
17.3.2 缓存和对象池 285
17.4 SSL事件监听机制 286
17.4.1 握手成功事件 286
17.4.2 SSL连接关闭事件 286
17.5 总结 287
第18章 Netty HTTPS服务端高并发宕机案例 288
18.1 Netty HTTPS服务端宕机问题 288
18.1.1 客户端大量超时 288
18.1.2 服务端内存泄漏原因分析 289
18.1.3 NioSocketChannel泄漏原因探究 290
18.1.4 高并发场景下缺失的可靠性保护 292
18.2 功能层面的可靠性优化 294
18.2.1 Netty HTTPS服务端可靠性优化 295
18.2.2 HTTPS客户端优化 296
18.3 架构层面的可靠性优化 297
18.3.1 端到端架构问题剖析 297
18.3.2 HTTP Client切换到NIO 298
18.3.3 同步RPC调用切换到异步调用 299
18.3.4 协议升级到HTTP/2 303
18.4 总结 307
第19章 MQTT服务接入超时案例 308
19.1 MQTT服务接入超时问题 308
19.1.1 生产环境问题现象 308
19.1.2 连接数膨胀原因分析 309
19.1.3 无效连接的关闭策略 309
19.1.4 问题总结 310
19.2 基于Netty的可靠性设计 311
19.2.1 业务定制I/O异常 311
19.2.2 链路的有效性检测 312
19.2.3 内存保护 313
19.3 总结 315
第20章 Netty实践总结 316
20.1 Netty学习策略 316
20.1.1 入门知识准备 316
20.1.2 Netty入门学习 319
20.1.3 项目实践 319
20.1.4 Netty源码阅读策略 319
20.2 Netty故障定位技巧 320
20.2.1 接收不到消息 320
20.2.2 内存泄漏 321
20.2.3 性能问题 322
20.3 总结 322
《Netty进阶之路》预售链接:
以上是关于k8s服务优雅退出的主要内容,如果未能解决你的问题,请参考以下文章