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“执行工作”,可能是虚拟服务器环境中花费很长时间完成的网络工作。构造顶层初始化数据库连接或类似的东西通常是个问题 - 要么在代码中构造它们,要么使用delay延迟构造直到使用。

为了调试出现此问题的内容,你需要获取堆栈跟踪。通常在Java中,你可以使用jps和jstack来查找并诱导jvm生成堆栈。

如果你无法互动查看,你可以在加载的任何东西中添加一些顶级代码来调用(Thread/dumpStack)。或者,你可以启动一个后台线程,循环执行此操作(使用Thread/sleep间隔)。

0

是否可以从 clojure 命令中看到输出,例如当它从其他服务器(如 Clojars.org 或 Maven central)下载依赖时生成的输出类型?

在启动缓慢的系统上,clojure -Sdescribe 的输出是什么?这是一个尝试性的猜测,但有一些旧的 clojure 命令与某些类型的依赖存在性能问题。

该问题出现在 Java 8 (u202+)、Java 11.0.2 和 Clojure < 1.10.1 版本上,并且你正在加载 user.clj 文件。如果你没有加载 user.clj 文件,那么这个问题不太可能出现。
$ 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 Runtime Environment GraalVM CE 20.1.0 (build 11.0.7+10-jvmci-20.1-b02)
OpenJDK 64-Bit Server VM GraalVM CE 20.1.0 (build 11.0.7+10-jvmci-20.1-b02, mixed mode, sharing)
...