Erlang节点的cpu占用率很高
我使用perf来检测节点的进程 性能命令:Erlang节点的cpu占用率很高,erlang,Erlang,我使用perf来检测节点的进程 性能命令:Perf record-g-p13586 sleep 10 结果: # Events: 7K cpu-clock # # Overhead Command Shared Object Symbol # ........ ....... .................. .................................... # 17.02%
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表中引用该进程来改变查询。