Ktor应用Docker部署到Ubuntu VServer启动耗时超3000秒如何排查?
问题根因
从提供的线程栈信息可以直接定位问题根源:程序阻塞在加密安全随机数生成逻辑上,本质是Linux VPS的系统熵池不足导致的。
- 代码在
WebsocketRouting.kt第40行的类初始化阶段调用了Kotlin随机数生成接口,底层默认依赖JDK的SecureRandom实现 - 新创建的空闲云服务器没有足够的硬件交互事件(键盘输入、鼠标操作、磁盘IO、网络波动)生成熵,
/dev/random设备会一直阻塞直到收集到足够的熵值才会返回随机数,就是启动耗时超长的核心原因 - 本地开发设备因为有大量用户交互事件,熵池始终处于充足状态,所以不会出现阻塞问题
修复方案
方案1:修改JVM启动参数(推荐,无需改动业务代码)
在Docker镜像的Java程序启动命令中添加如下参数,指定SecureRandom使用非阻塞熵源:
java -Djava.security.egd=file:/dev/./urandom -jar 你的应用包名.jar
路径中写/dev/./urandom是为了兼容旧版本JDK的路径校验逻辑,部分老版本JDK直接配置/dev/urandom不会生效。
方案2:系统层面安装熵生成服务
在VPS宿主机上安装haveged服务,主动生成熵填充系统熵池:
# Ubuntu 20.04执行如下命令 apt update && apt install -y haveged systemctl enable --now haveged
方案3:代码层面调整随机数实现
如果业务场景不需要加密安全级别的随机数,可以显式指定使用不依赖系统熵池的随机数实现,从根本上避免阻塞。
验证调试方法
- 执行命令
cat /proc/sys/kernel/random/entropy_avail即可查看当前系统可用熵值,正常可用值应高于1000,低于200时就会出现明显的随机数生成阻塞 - 修复后重启服务,查看启动耗时即可验证是否生效
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

