架构
Docker
内部署SpringCloud
,使用spring-cloud-gateway
做路由
问题描述
下载400M
文件时下载不全,只能下载到80 ~ 120M
左右,之后就结束下载。文件服务报错Broken pipe
错误
排查思路
- 本地启动服务测试下载正常
- 测试环境测试正常
- 本地连接到生产环境测试正常( ̄□ ̄||)
到这里我以为是
Docker
容器导致的报错
- 查看容器日志(
journalctl -u docker -n 200
查看Docker近200条日志数据)
发现有一行内存溢出的错误
ERROR c.g.g.handler.MyExceptionHandler - reactor.netty.ReactorNetty$InternalNettyException: io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 520093703, max: 521142272)
Suppressed: re
- 检查报错位置为
Gateway
服务
到此所有问题都明清楚了
问题解决
增大Gateway
服务的内存
疑问解答
- 为什么本地和测试环境下载正常?
- 本地和测试环境未设置
Gateway
服务内存上限,生产环境设置了最大内存空间为500M
,后改为2000M
- 本地和测试环境未设置
- 为什么本地连接到生产环境未出现异常?
- 推测为网络IO问题。生产环境中
Gateway
和File
服务在同一个Docker
容器中。网络IO远远小于Gateway
往客户端写数据的速度。而本地连接到生产环境后,File
和Gateway
的IO与Gateway
写回客户端的IO相仿,不会导致Gateway
内存溢出问题
- 推测为网络IO问题。生产环境中