本学期的一门课程,学生有接近100人,在使用Jupyterlab过程中,并发人数过多后就会导致其遇到无法服务问题,具体表征就是jupyter的kernel一直显示connecting,但始终无法连接。
第一次遇到此问题后,将班级分组、服务器硬件升级(内存从64G到320G),最近一次上课在练习wordcloud时发现又出现此问题,同时注意到,在出现问题时,服务器内存和cpu并没有占满,因此可以排除硬件问题。
网上搜索后,发现也有人遇到同样的问题,如:
TLJH Jupyterhub randomly times out
Performance, large machines and few users: connection issues #486
但这几个讨论最终都没有找到问题,但其中提到使用journalctl查看log信息,于是根据出现问题的时间查看其中出现的错误。
sudo journalctl -r --no-pager > tljh.log
找到第一个的错误是发生在traefik中,提示:502 Bad Gateway,但搜索一下,发现这个问题应该不是traefik导致的。
然后找到第二个错误:
zmq.error.ZMQError: Too many open files
看起来这个错误就很像是我们需要解决的问题。搜索了一下,发现这个问题是服务器默认限制了用户能同时打开的文件数,默认是1024。可以用下面这个命令测试:
ulimit -n
然后将在系统中将此参数调大至131072,在shell中测试发现此命令已经生效。但到了jupyterlab的terminal中测试此命令,突然发现有问题了,其结果一直是4096,而不论系统中将此值如何调大。
继续google之,发现此问题是有这个代码导致的:
https://github.com/jupyter/notebook/pull/5075/commits/e46a344fa68b8b33bed1d9962221365893c5d881
在此代码逻辑中,若系统的hard limit>4096,则设置min_open_files_limit为4096,但现在遇到的问题则有明显表示此值已经过小了,因此到这一步的处理方法就是直接修改tljh的代码,将这一行的代码修改为409600。
服务器对应的文件为:/opt/tljh/user/lib/python3.9/site-packages/notebook/notebookapp.py
发表回复