0 0

gen_udp:send 导致CPU100%10

最近写了一个程序对udp SERVER进行压测,测试程序很简单,就是启1000个进程,每个进程不停的发包。
 start_test() ->
         lists:foreach(fun(_X) -> spawn(?MODULE,test,[]) end,lists:seq(1,1000)).
     
     test() ->
         {ok,Socket} = gen_udp:open(0,[binary,{active,false}]),
         testloop(Socket).

     testloop(Socket) ->
         gen_udp:send(Socket,?IP,?PORT,<<"hello">>),
         testloop(Socket).


问题是程序一启动,CPUy就100%了,vm 的启动是用 erl -smp disable +K true 已经启用epoll了。strace的结果如下
strace -T -tt -p 24241 -c 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 61.13    0.018473           0    594436           clock_gettime
 37.35    0.011286           0    284586           sendto
  0.84    0.000255           0     25423           epoll_wait
  0.53    0.000161           2        79           munmap
  0.14    0.000043           0       324           read
  0.00    0.000000           0        59           gettimeofday
  0.00    0.000000           0       324           writev
  0.00    0.000000           0        56           mmap2
------ ----------- ----------- --------- --------- ----------------
100.00    0.030218                905287           total

测试机AMD的双核CPU,主频2G,SUSE10系统,
在我的笔记本上(Ubuntu10.04)同样的测试程序,并没有出现上面的clock_gettime调用。
各位老大帮忙看看程序是哪里出问题了。


问题补充: <br />1000个经常猛发udp包,当然cpu100%。 gen_udp自己本身没有什么开销,基本上是send系统调用在发力。clock_gettime是ERTS的poll在调用. Erlang是基于事件派遣的,每次事件检查后都调用取时间函数。 <br /> <br />谢谢。那如何才能发的更快呢?将并发的个数减少?我试了10个并发,发包速度可以达到50K/s,这就是极限了吗?能不能再提高呢?小弟初学erlang,对网络也不是很熟,先谢谢了。
2010年9月01日 00:19

1个答案 按时间排序 按投票排序

0 0

louieuser 写道
最近写了一个程序对udp SERVER进行压测,测试程序很简单,就是启1000个进程,每个进程不停的发包。
 start_test() ->
         lists:foreach(fun(_X) -> spawn(?MODULE,test,[]) end,lists:seq(1,1000)).
     
     test() ->
         {ok,Socket} = gen_udp:open(0,[binary,{active,false}]),
         testloop(Socket).

     testloop(Socket) ->
         gen_udp:send(Socket,?IP,?PORT,<<"hello">>),
         testloop(Socket).


问题是程序一启动,CPUy就100%了,vm 的启动是用 erl -smp disable +K true 已经启用epoll了。strace的结果如下
strace -T -tt -p 24241 -c 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 61.13    0.018473           0    594436           clock_gettime
 37.35    0.011286           0    284586           sendto
  0.84    0.000255           0     25423           epoll_wait
  0.53    0.000161           2        79           munmap
  0.14    0.000043           0       324           read
  0.00    0.000000           0        59           gettimeofday
  0.00    0.000000           0       324           writev
  0.00    0.000000           0        56           mmap2
------ ----------- ----------- --------- --------- ----------------
100.00    0.030218                905287           total

测试机AMD的双核CPU,主频2G,SUSE10系统,
在我的笔记本上(Ubuntu10.04)同样的测试程序,并没有出现上面的clock_gettime调用。
各位老大帮忙看看程序是哪里出问题了。


1000个经常猛发udp包,当然cpu100%。 gen_udp自己本身没有什么开销,基本上是send系统调用在发力。clock_gettime是ERTS的poll在调用. Erlang是基于事件派遣的,每次事件检查后都调用取时间函数。

2010年9月01日 00:19

相关推荐

    gen_lex_hash_pc

    《gen_lex_hash_pc:MySQL交叉编译的关键工具详解》 在IT行业中,数据库管理系统是核心组件之一,而MySQL作为开源关系型数据库的代表,广泛应用于各类项目中。在特定环境下,如嵌入式设备或资源有限的PC平台,我们...

    华硕Z87主板BIOS_updater_for_4th_Gen_Intel_Core_CPU.zip

    这个“华硕Z87主板BIOS_updater_for_4th_Gen_Intel_Core_CPU.zip”压缩包就是用于更新该主板BIOS的工具,以确保与最新硬件和软件的兼容性,解决潜在问题,提高系统的稳定性和性能。 BIOS更新通常包含以下好处: 1. ...

    mcdt.zip_mcdf_mcdt_mcdt验证平台_solvefaildebug_sv中mcdt

    1. 理解mcdf_root_test::gen_stop_callback()和 mcdf_root_test::run_stop_callback()的作用。 2. 按照实验代码中的要求,实现测试用例mcdf_burst_test,并 且在波形中检查三个通道的激励是否按照符合BURST发送要求...

    gen_tcp的close与delay_send交叉问题

    在实际应用中,开发者可能会遇到`gen_tcp`的`close`函数与`delay_send`选项之间的交互问题。本文将深入探讨这两个函数的工作原理以及它们可能导致的问题。 `gen_tcp:close/1`是用于关闭一个TCP连接的函数,它会发送...

    dftables X86

    bin/sh: ./gen_test_char: cannot execute binary file ,这个时候我们需要编一个X86版本的gen_test_char来取代他,如果不想编译,可以直接下载,放到httpd-2.2.22/server目录下,继续make,编译成功 最终安装的东西...

    Gen_NN.rar_Gen:NN__DLL_visual c_算法优化_遗传 神经

    本项目"Gen_NN.rar_Gen:NN__DLL_visual c_算法优化_遗传 神经"结合了这两种方法,旨在通过遗传算法优化神经网络的性能,且使用C++编程语言进行实现。 首先,让我们深入了解遗传算法。遗传算法是一种模拟自然选择和...

    gen_unix:Erlang Unix套接字接口

    gen_unix是Unix套接字的Erlang接口。 gen_unix的主要目的是允许访问fd和凭据传递所需的套接字辅助数据。 警告:gen_unix仍在开发中,并且需要进行很多更改。 例子 文件描述符传递 打开2个shell提示,并在每个提示中...

    gen_lang:gen_lang是国际化的Dart库。 在Intl_translation和Flutter i18n的启发下,提取消息以生成Intl所需的dart文件

    gen_lang gen_lang是国际化的Dart库。 提取消息以生成所需的dart文件。 现在,国际化的三个步骤 准备Json文件 运行gen_lang 在编码中使用它 安装 将这些库添加到pubspec.yaml dependencies: flutter_...

    ry-vue-v3.8.6数据库设计

    在ry-vue-v3.8.6数据库设计中,gen_table表和gen_table_column表是紧密相关的,gen_table表存储业务表信息,而gen_table_column表存储业务表字段信息。qrtz_blob_triggers表则用于存储Blob类型的触发器信息。本设计...

    gen_bittorrent:gen_bittorrent行为

    《gen_bittorrent:Erlang中的P2P种子生成器》 在IT行业中,BitTorrent是一种广泛应用的点对点(P2P)文件共享协议,它允许用户通过网络高效地分发大文件。Erlang,作为一种强大的并行和分布式计算语言,也被广泛...

    Gen_Signature_Android2

    标题"Gen_Signature_Android2"指的是一个特定的工具,它用于生成Android应用的签名,这通常是在发布应用到Google Play或其他第三方市场之前所必需的步骤。这个工具可能是为简化开发者的工作流程而设计的,使得他们...

    Gen_Signature_Android 签名解析工具

    签名过程通过数字签名技术,对APK的内容进行哈希计算并添加开发者私钥,这样任何对APK的修改都会导致签名无效。 2. **签名流程**:首先,开发者使用密钥对APK进行签名,这个过程涉及到生成密钥对(公钥和私钥),...

    gen_server:Erlang 的 gen_server 的(不完整的)OcamlAsync 实现

    《Erlang gen_server在OcamlAsync中的实现探索》 Erlang的gen_server是其并发模型的核心组件,它提供了一种强大的状态管理和错误处理机制。而在OCaml语言中,尽管有着自己的并发库如Async,但直接移植或模仿Erlang...

    gen_amqp:更容易rabbitmq连接处理的行为

    gen_amqp ####License: MIT ####Copyright: 2012, 2013 SiftLogic LLC gen_amqp是一种更容易处理 AMQP 连接的行为。 它使用handle_basic_deliver/3和handle_basic_cancel/2的附加回调扩展了gen_server行为。 除此...

    emoji-hash:EmojiHash是一个干净的,零依赖性的Javascript库。 :partying_face::shushing_face::lion:

    表情符号哈希轻量级,零依赖的库,用于以表情符号样式生成哈希 :...hash-gen : $ &gt; npm install emoji-hash-gen# or$ &gt; yarn add emoji-hash-gen 用法import { getHash } from 'emoji-hash-gen' ;getHash ( 'Hell

    Gen_Signature_Android.apk

    《Android应用签名详解——以Gen_Signature_Android.apk为例》 在移动应用开发领域,尤其是Android系统中,应用的签名是确保软件安全性和完整性的关键环节。本篇文章将详细探讨Android应用签名的重要性、原理以及...

    srio_response_gen_srio_gen2_0_srio_gen_srio_reponse_SRIO_gen2_SR

    标题 "srio_response_gen_srio_gen2_0_srio_gen_srio_reponse_SRIO_gen2_SR" 提到的是一个与SRIO(Serial RapidIO)相关的响应生成模块,它可能是一个硬件描述语言(如Verilog或VHDL)设计的源代码文件。SRIO是一种...

    Gen_Signature_Android2.zip

    标题“Gen_Signature_Android2.zip”中的"Gen_Signature"指的是生成签名的过程,而"Android2"可能表示这是针对Android平台的第二个版本的工具或方法。这个压缩包文件包含一个名为"Gen_Signature_Android2.apk"的应用...

    gen_http:具有可插拔客户端实现的实验性通用HTTP接口

    《gen_http:构建可插拔客户端的实验性通用HTTP接口》 在Erlang编程语言中,gen_http库提供了一个实验性的通用HTTP接口,它的核心特性在于其可插拔的客户端实现。这个设计允许开发者根据具体的应用场景和性能需求,...

    RabbitMQ系统客户端连接到RabbitMQ服务端消息通信过程1

    - 心跳机制用于检测连接是否中断,防止网络问题导致的长时间无响应。心跳消息由客户端和服务端的定时进程定期发送。 - 如果心跳超时,相关进程将发送警告或关闭连接。 5. ** OTP 监督树和进程管理**: - Erlang...

Global site tag (gtag.js) - Google Analytics