Erlang节点的cpu占用率很高

Erlang节点的cpu占用率很高,erlang,Erlang,我使用perf来检测节点的进程 性能命令:Perf record-g-p13586 sleep 10 结果: # Events: 7K cpu-clock # # Overhead Command Shared Object Symbol # ........ ....... .................. .................................... # 17.02%

我使用perf来检测节点的进程

性能命令:
Perf record-g-p13586 sleep 10

结果:

# Events: 7K cpu-clock
#
# Overhead  Command       Shared Object                                Symbol
# ........  .......  ..................  ....................................
#
    17.02%     beam  beam                [.] copy_struct
               |
               --- copy_struct

    12.38%     beam  beam                [.] size_object
               |
               --- size_object

    11.85%     beam  beam                [.] db_prog_match
               |
               --- db_prog_match

     7.78%     beam  beam                [.] db_select_hash
               |
               --- db_select_hash

     6.90%     beam  beam                [.] process_main
               |
               --- process_main

     4.70%     beam  beam                [.] do_minor
               |
               --- do_minor

     4.23%     beam  beam                [.] element_2
               |
               --- element_2

     3.30%     beam  beam                [.] sweep_one_area
               |
               --- sweep_one_area

     1.53%     beam  beam                [.] cmp
               |
               --- cmp

     1.39%     beam  beam                [.] copy_shallow
               |
               --- copy_shallow
正如您所看到的,
copy_struct
size_object
成本很高

调度程序正在忙着复制消息吗

仅供参考,我对desc进行了排序并获取了节点上的前10个进程,这似乎很正常


由于我们在一个系统上有大约6个节点,所以smp被禁用。我们打开它好吗?

只要一个术语通常必须是副本,而不仅仅是消息,就使用copy struct

由于db_*也相当高,我可以想象复制结构来自于向ets表复制数据和从ets表复制数据


关于您是否应该使用smp,它可能会使系统性能更好,但您确实应该尝试使用它并测量系统的结果,因为它将根据您的系统所做的事情而有所不同

谢谢。我们使用eprof发现,
ets:insert
虽然执行的次数很少,但需要花费很多时间。也许你可以通过在ets中拆分你的大项来赢得很多,这将有助于复制。或者通过让大型结构位于进程中并在ETS表中引用该进程来改变查询。