我正在调整Erlang项目的性能。我遇到了一个奇怪的情况。因为在某些情况下我想使用CPU功率(多核)的全部功率,所以在我的测试中CPU利用率将达到100%左右。
然后,我发现了一些奇怪的东西,其中有些代码必须同步,因此我使用gen_server:call
来完成此任务。但是当CPU繁忙时,gen_server的实际任务是在很短的时间内完成的(从ETS读取值)。但是我终于有了gen_server:call
的长时间处理时间。分析之后,我发现花在gen_server:call
上的大部分时间都在等待中(90%+)。就我而言,该任务运行3000次。总任务时间约为100毫秒。但是拨打gen_server:call
大约需要3秒钟。
在这种情况下,如果gen_server:call
非常昂贵,那么为什么我应该使用它来实现gen_server行为呢?如果直接直接执行任务,看起来会更好。
有人知道为什么gen_server:call
可能要花这么长时间吗?
谢谢
埃里克