请在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/issue...

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 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)
...