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

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

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

我在服务器上直接从 git 仓库使用 clojure CLI 运行我的 clojure 应用程序。我遇到了一个问题,虚拟服务器上启动需要 5-25 分钟,而在我的笔记本电脑上只需要 1 分钟。在这段时间里,CPU 使用率几乎为零,只有 4GB 内存的一小部分被使用。我怀疑这可能是一种锁定条件。这似乎可能与依赖项有关,因为我记不起之前有过这样的情况。有哪些方法可以诊断问题是什么?

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

要调试出现此问题的部分,您需要获取堆栈跟踪。通常,您可以使用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 version "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)
...