2024 Clojure状态调查! 中分享您的想法。

欢迎!有关如何进行操作的更多信息,请参阅 关于 页面。

+1赞成票
命名空间和变量
编辑

我在服务器的git仓库中直接使用clojure CLI运行我的clojure应用。我遇到了一个问题,在虚拟服务器上启动需要大约5-25分钟,在我的笔记本电脑上大约需要1分钟。在这段时间里,CPU使用几乎为零,4GB RAM的使用也很少。我怀疑这是一种锁定条件。这似乎与依赖关系有关,因为我记不得以前做过这件事。有哪些方法可以诊断出问题所在?

$ time clojure -A:server -e "(require 'riverdb.server)"
WARNING: requiring-resolve already refers to: #'clojure.core/requiring-resolve in namespace: datomic.common, being replaced by: #'datomic.common/requiring-resolve
    
real	24m49.555s
user	1m58.976s
sys	0m3.672s

我尝试了 https://clojure.org/guides/dev_startup_time 中的解决方案,我觉得有些帮助,但我多次运行时延迟差异很大。

$ time clojure -A:dev:server -e "(require 'riverdb.server)"

real	5m19.167s
user	0m29.084s
sys	0m1.724s

$ time clojure -A:dev:server -e "(require 'riverdb.server)"

real	19m53.558s
user	0m31.972s
sys	0m1.988s

3 答案

+1赞成票

选择
 
最佳答案

尝试 (require 'riverdb.server :verbose)

如果您能够交互式地观察控制台以确定“加载慢”的位置,这是一个很好的建议。否则,可能只是一份ns列表,不太有帮助。

修改了
哦,这是一个我不知道的绝佳选择!它在
    (clojure.core/load "/buddy/core/keys/jwk/ec")处卡住了。

将buddy/buddy-core从1.6降级到1.4解决了问题。

这里有相关的问题票据:https://github.com/funcool/buddy-core/issues/70

Buddy在加载命名空间时“做工作”生成密钥,这在虚拟服务器上耗尽了熵,因此一个变通方法是像这样调用它

time clojure -A:server -J-Djava.security.egd=file:/dev/urandom -e "(require 'riverdb.server :verbose)"
+1赞成票

可能您在启动时加载的某个东西有一个顶层def,该def“做了工作”,可能是在虚拟服务器环境中执行了很长时间的网络工作。构建顶层defs,例如初始化数据库连接等,通常是一个问题 - 要么在代码中构建它们,要么使用delay来延迟构造直到使用。

要调试出现此问题的什么,您需要获取堆栈跟踪。通常,使用Java可以通过jps和jstack找到并诱导jvm生成堆栈。

如果您不能交互式地查看它,您可以在加载的任何东西中添加一些顶层代码以调用(Thread/dumpStack)。或者您可以在后台线程中轮询执行此操作(使用Thread/sleep之间的等待)。

0 投票
by

您是否能从 clojure 命令中找到任何可以检查的输出,例如它从其他服务器下载数据库时产生的输出,例如从 Clojars.org 或 Maven central 下载数据库吗?

在启动慢的系统上,clojure -Sdescribe 的输出是什么?这是一个大胆的猜测,但之前有关于 clojure 命令的性能问题,这些问题可能与某些类型的依赖有关。

by
这个问题是在 Java 8 (u202+),Java 11.0.2 和 Clojure < 1.10.1 的版本中存在的,如果您没有加载 user.clj 文件,那么很可能这不是问题所在。
by
$ clojure -Sdescribe
{:version "1.10.1.536"
 :config-files ["/usr/local/lib/clojure/deps.edn" "/home/riverdb/.clojure/deps.edn" "deps.edn" ]
 :config-user "/home/riverdb/.clojure/deps.edn"
 :config-project "deps.edn"
 :install-dir "/usr/local/lib/clojure"
 :config-dir "/home/riverdb/.clojure"
 :cache-dir ".cpcache"
 :force false
 :repro false
 :resolve-aliases ""
 :classpath-aliases ""
 :jvm-aliases ""
 :main-aliases ""
 :all-aliases ""}

$ java -version
openjdk 版本 "11.0.7" 2020-04-14
OpenJDK 运行环境 GraalVM CE 20.1.0 (构建 11.0.7+10-jvmci-20.1-b02)
OpenJDK 64 位服务器 VM GraalVM CE 20.1.0 (构建 11.0.7+10-jvmci-20.1-b02,混合模式,共享)
...