【问题标题】:Erlang file IO and asynchronous threadsErlang 文件 IO 和异步线程
【发布时间】:2012-01-15 13:30:12
【问题描述】:

我正在阅读关于 file io 的 erlang 文档并看到了这个:

在支持线程的操作系统上,可以让文件 操作在它们自己的线程中执行,允许其他 Erlang 进程继续与文件操作并行执行。 请参阅 erl(1) 中的命令行标志 +A。

所以我的预期是,如果我添加异步线程,IO 操作所需的时间会减少。
相反,当我尝试运行 erl +A1erl +A6erl +A12(在 6 核机器上)时,写入文件所需的时间增加了 5-10 倍。

我使用timer:tc/3 来测量时间,并在使用raw 标志打开文件时使用io:write/2file:write/2(将术语转换为二进制)和file:write/2。这个词的大小约为 170kb,被写了 1000 次。用过 R14B04(但我用 R15A 也得到了类似的结果)。

我在利用异步 IO 或衡量其效率方面做错了吗?

会不会是传递术语(可能是因为它的大小很小)引入的开销超过了获得的加速?

(不那么优雅:$)代码:

-module(test).
-compile(export_all).

test()->
    {ok,F}=file:open(foo,[raw,write]),          % or just [write]
    {T,ok}=timer:tc(test,t,[F,1000]),
    file:close(F),
    T.

t(_,0)->ok;
t(F,A)->
    B=dsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdf,

    file:write(F,
term_to_binary([B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B])),
%or io:write(F,[B,..])
    t(F,A-1).

我对最小化 IO 开销(基本上只是输出)感兴趣,因为我想在分析期间将一些数据写入磁盘;这就是为什么将数据发送到将进行写入的其他进程没有帮助的原因(除非我可以以某种方式将核心投入到进程中)。到目前为止,最好的方法似乎是打开一个原始文件,积累数据然后写入它们;任何提示将不胜感激:)

【问题讨论】:

    标签: asynchronous io erlang


    【解决方案1】:

    当我运行测试时,使用 +A1 和不使用 +A1 时,我得到的性能大致相同。这是在具有双核处理器的 OS X Snow Leopard 上。这也是我使用异步线程所期望的。

    添加异步线程只会添加额外的线程来执行 IO,从而提高并行 IO 作业的性能,并且它还允许正常的 erlang 进程以更快的速度运行,因为进程线程不忙于执行 IO 作业。

    如果您使用许多并行作业运行测试,您应该会看到使用异步线程带来的性能提升。

    但是,为什么您会在顺序测试中看到性能下降是一个谜。

    【讨论】:

    • 哦,这绝对解释了为什么串行 IO 没有任何加速,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多