criyle / go-judge

Sandbox Server in REST / gRPC API. Based on Linux container technologies.
MIT License
419 stars 67 forks source link

运行4天之后全部报File Error #66

Closed winterant closed 1 year ago

winterant commented 1 year ago

以docker容器运行4天之后,突然对所有请求(包括以前正常的请求)都返回File Error,error字段内容:

write /dev/shm/executorserver796031983/JWUUBQBH: no space left on device

重启容器之后恢复正常。

看起来是内存不足,但错误发生时记了一下内存信息,挺充足的:

               total        used        free      shared  buff/cache   available
Mem:            62Gi       8.2Gi       3.9Gi        30Mi        50Gi        53Gi
Swap:           15Gi       0.0Ki        15Gi

由于重启后恢复正常,没有记录下更多信息。请大佬帮忙看下可能是什么问题导致?

criyle commented 1 year ago

程序使用共享内存文件系统 /dev/shm 来储存由 copyOutCached 指定的文件,此文件系统默认在 docker 大小为 64 兆字节。可以以 --shm-size=256m 来增加空间。如果是长时间运行发生的问题,很可能是创建的临时文件没有被完美的删除。建议检查程序的边界情况判明遗漏情况。也可以添加 -file-timeout=10m 参数来指定文件自动过期时间。

winterant commented 1 year ago

明白了,感谢! 我检查下,再观察几天看看。

criyle commented 1 year ago

此处 编译失败时,可能有编译的文件被缓存但是没有进入到删除模式。同时,删除缓存操作在运行时异常丢出的时候并不保证会被执行,可能需要 try-catch 来保证。同时 copyOutDir 参数是不必要的。

winterant commented 1 year ago

此处 编译失败时,可能有编译的文件被缓存但是没有进入到删除模式。同时,删除缓存操作在运行时异常丢出的时候并不保证会被执行,可能需要 try-catch 来保证。同时 copyOutDir 参数是不必要的。

大佬太强了!感谢指出!

刚才经过本地验证,确实存在“可能有编译的文件被缓存但是没有进入到删除模式”这种情况。日志表明Judger有执行失败的情况(如超时),需要 try-catch 来保证。然后再用-file-timeout=10m确保一下。

如果方便,可否加一下联系方式交流?QQ545734785

winterant commented 1 year ago

今天又出现上述情况了。貌似不是缓存文件的问题,缓存文件并不多: A27524A41CB2C7C5B58FB566D6ACBBCD

服务器内存剩余50G,磁盘还有200G。

附加说明:已经设置了环境变量ES_FILE_TIMEOUT=10m

criyle commented 1 year ago

程序使用共享内存文件系统 /dev/shm 来储存由 copyOutCached 指定的文件,此文件系统默认在 docker 大小为 64 兆字节。可以以 --shm-size=256m 来增加空间 (docker compose 为 shm_size 参数)

可以尝试 docker exec -it container_id /bin/bash 进入容器,然后 df -h 查看 /dev/shm 使用空间