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 会“执行操作”,可能是耗时较长的网络操作。在虚拟服务器环境中,顶层初始化数据库连接等操作通常会引起问题 - 要么在代码中构建它们,要么使用 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 version "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,混合模式,共享)
...