留言板

February 22nd, 2024 Leave a comment Go to comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: 留言板

各位兄弟姐妹们,欢迎各种意见和建议,一起学习提高!

Post Footer automatically generated by wp-posturl plugin for wordpress.

  1. 刘峰林
    November 21st, 2011 at 17:54 | #1

    英雄所见略同,虽然达到目的,但这手段太劣了点

    [Reply]

  2. qinlinwang
    November 24th, 2011 at 13:55 | #2

    余老师,你好:
    我现在在调试一段erlang服务器的一段程序,遇到一个很奇怪的问题,当程序运行一段时间的时候,在程序中调用receive。。。after的这样的语句时,如果接收不到消息,这个进程就会一直阻塞在那里,及根本不会超时,当我调用timer:sleep/1这样的函数的时候,这个进程也会一直睡觉。当我在另外一台测试服务器上测试的时候却是好的。这两天服务器环境都是一样的。请问余老师以前遇到这样的问题没有,应该怎么来找原因呢?

    [Reply]

    Yu Feng Reply:

    用dbg模块跟下消息,我博客里有

    [Reply]

    qinlinwang Reply:

    关键是实在执行receive这个语句出不来了,理论上应该在after后面规定的时间内醒来的。
    receive这是个关键字语句,怎么跟踪呢?

    [Reply]

    Yu Feng Reply:

    那还是把语法好好学学吧

    qinlinwang Reply:

    额,语句写的应该是没有问题的,而且代码再另外一个同样环境的的机器上是好的,不知道在这台为啥就不行

  3. shawn
    December 25th, 2011 at 14:06 | #3

    我想问下,在erlang中如何打印函数的调用栈?,
    我经常在处理逻辑的时候,读入了一个非法的参数
    ,但是我不知道是哪个模块调用了该函数并传入该参数,我想打印出调用的栈过程,

    [Reply]

    Jovi Reply:

    erlang:process_info(self(), current_stacktrace).
    erlang:process_display(self(), backtrace).
    erlang:process_info(self(), backtrace).

    [Reply]

    Yu Feng Reply:

    erlang的自省机制很发达~

    [Reply]

  4. Jiecong
    December 26th, 2011 at 16:04 | #4

    余老大,看你对erlang非常熟悉啊。最近刚学erlang,想问一下有没有简单点erlang开源程序可以学习?erlang的语法真是用起来变扭,需要看一些人家写代码来提升一下。谢谢!

    [Reply]

    Yu Feng Reply:

    https://github.com/basho/rebar 非常不错的学习材料,严谨,易学。

    [Reply]

    Jiecong Reply:

    谢了,余老大

    [Reply]

  5. ClarenceAu
    January 12th, 2012 at 18:47 | #5

    霸主,你好.我刚刚学习erlang,去实习然后老大要求我用erlang正则匹配一个1.8g,有10800000行记录的日志文件.不过目前我自己尝试的两种方式是一种用多进程pread,然后每个进程自己分析自己的部分,然后把片段的头尾(就是不成一行的)和匹配数发到Collector进程,这种方式,不做匹配时59770ms,做匹配是82283ms,另一种是用多个进程不断向一个File句柄read_line,读出一行后马上本进程内匹配,然后把结果发给Collector,一直读到eof.这种方式不做匹配是70167ms,做匹配是90917ms,匹配的只是一个测试的正则,就”.*”,然后,想问一下你觉得这两种方案怎么样?我的机器是Dual-core e5800 3.2G,2g内存.而且对于正则有没有什么好的意见,感觉erlang的正则挺慢的.

    [Reply]

    Yu Feng Reply:

    时间主要花在读文件上。

    [Reply]

    Yu Feng Reply:

    文件要用raw方式打开,然后一次读一段出来,比如64K, 然后用regex处理,多个进程进行,然后汇总。会写的根本不慢。

    [Reply]

    ClarenceAu Reply:

    我现在是用binary,我回去再试试用raw。然后你觉得就以这个配置,这个时间你觉得是正常还是太慢了?就是普通台式,cpu和内存我写在原文了。其实时间应该是花在处理读出来的数据上。我试过,用多进程读,然后就读文件用不做任何处理是大概15秒。我觉得就读文件的话,15秒应该是可以接受的速度吧?

    ClarenceAu Reply:

    你说的raw打开,就是说,我只用一个进程去每次读一大段,然后spawn一个处理的进程去处理?因为raw模式打开不是只能在该线程本身去读吗?

    Yu Feng Reply:

    把文件的大小按进程数目划分,每个进程负责offset, offset+size这么大的区间,分别自己raw方式打开文件,每次读取一个chunk,然后再regex,这样应该比单线程的c程序快N倍。

  6. ClarenceAu
    January 13th, 2012 at 18:32 | #6

    霸主,再问你一个小小的问题.就是我看erlang的书说,atom是不会被gc的,那在实际项目中会不会很容易就会由于atom太多而导致内存占用过高或者内存泄漏的问题.

    [Reply]

    Yu Feng Reply:

    atom有上限制的,超过了vm已经崩溃,不用考虑gc的事情了

    [Reply]

    ClarenceAu Reply:

    霸主,能解释一下ERL_FULLSWEEP_AFTER这个参数的意思吗?我看过你的一篇文章里提到过,但是不是很明白.然后,就是在Erlang的文档里,哪里可以看到所有这些参数的说明?谢谢.

    [Reply]

    Yu Feng Reply:

    由于erlang的gc是mark and sweep的标准gc, 通常gc的时候是minor的,就是每次回收点点就好。这个参数的意思是多长时间后进行一次大扫除,全量GC。 注意erlang的回收是针对每个进程进行的。

  7. ClarenceAu
    January 17th, 2012 at 17:28 | #7

    霸主,我终于解决了之前那个大日志的问题了.竟然是因为我的正则表达式的一点小bug,导致平均每条匹配时间多了5倍,10000k条记录!!那个时间啊.不过对于正则我觉得在使用的时候真得要多加注意.要根据具体实现来写合理的表达式.

    [Reply]

    Yu Feng Reply:

    恭喜,数据说话!

    [Reply]

    ClarenceAu Reply:

    1.6G日志文件,10000k+条记录,在我的普通台式上,2G内存,Dual-Core E5800 3.2G主频,匹配完成后,时间是用了231秒.不知道这算不算好成绩.我的主管说我能跑到300秒以内就算可以了.

    [Reply]

    Yu Feng Reply:

    多核上运行应该快很多~

  8. ClarenceAu
    January 19th, 2012 at 15:59 | #8

    霸主,我发现erlang里有个binary的module,它里面提供的那些函数很象是一些使用binary来作匹配的的函数,请问那个module里可以用正则表达式吗?还是只是简单的pattern matching?

    [Reply]

    Yu Feng Reply:

    re模块支持binary

    [Reply]

  9. rock
    January 31st, 2012 at 16:37 | #9

    余锋老大,请教个问题:
    我有这么个应用场景:一个程序每秒10万包(每包512字节)的速度写共享存储(GFS2文件系统),另外2个程序监控这个文件,当发现有新的数据写到这个文件后,立即读取出来,这三个程序分别在不同的主机上,要求:
    1,写RTT在100us以内;
    2,2个读程序的读最新数据的延迟不超过1秒(即写程序写完一块数据后,读程序侦测到,并读到自己内存中的时间);

    您看这个能不能实现?如果能的话,需要什么样的硬件?我要申请买设备了,谢谢!

    [Reply]

    Yu Feng Reply:

    按照你的描述,你的包不是很大,fusionio二代卡在典型的512字节写入的速度在每秒10万以上,写入延时在20-30us,所以距离你的100us是够的。考虑到容量,可以用flashcache做cache,大大减少成本,还能满足你的性能需求。 文件的变更linux有notify接口,可以保证很快的读到数据,1秒足够的。

    [Reply]

    rock Reply:

    老大,用flashcache的话,数据还能及时到达共享存储吗(比如说SAN)?读这边的及时性会不会不好?

    另外,我这个应用的写方类似于数据库的提交事务日志的操作,要求写返回成功后,掉电、文件系统crash等这个数据都不会丢失,即写的时候是fsync方式的,你看fusionio二代能够满足吗?

    [Reply]

    Yu Feng Reply:

    1. 用flashcache不能及时,所以san读会有问题。
    2. fusionio一代和二代都满足这个不丢数据的约束,我们用了很多,1年多了没有发现问题。

    rock Reply:

    老大,还有fusionio二代卡有成功应用的案例吗?比如说淘宝?我在证券开发行业,对技术的成熟度要求非常高

    Yu Feng Reply:

    我们核心的数据库的对技术的成熟度也是非常高~过几天我们就会拿到卡测试。如果担心的话,可以用一代卡~

    rock Reply:

    谢谢,老大,我测试过很多盘,buffer io时性能很好,direct io就挂了,好了,那我就买fusionio吧,非常感谢!

    Yu Feng Reply:

    Amy: fusionio的销售email: tongouou@gmail.com

    rock Reply:

    谢谢,余大哥,已经发邮件给Amy了。

    我们这个场景要求的是3台主机共享的存储,而且要使用类似GFS2这样的共享文件系统,有分布式锁,真不知道还是否能够达到这个要求,咳,愁啊,测试下吧。

    Yu Feng Reply:

    GFS2文件系统稳定靠谱吗?

    rock Reply:

    另外,余大哥,针对俺这个应用,如果你有更好的实现方案,不吝赐教啊:)

    rock Reply:

    是啊,GFS2的稳定性不好说啊,但是需求要共享存储,读写同个文件,还有别的办法吗?NFS也试了。。。

  10. 老栋
    March 13th, 2012 at 22:57 | #10

    霸爷,久仰前辈linux系统功底。问个问题,我现在一个项目里需要用到许多系统方面的数据,比如CPU,内存,缓存,swap区等各方面的数据,除了从/proc目录读文件之外,有没有其他方法可以比较漂亮的取得这些数据?

    [Reply]

    Yu Feng Reply:

    /proc导出的信息是最根本的,通常都会有专用的工具在/proc的基础上再封装一次,对用户更友好。这类工具很多,有问题我们来谈论。

    [Reply]

    老栋 Reply:

    郁闷,评论回复为什么没有邮件通知呢?苦苦盯着邮箱等了好几天哈哈。

    [Reply]

  11. 老栋
    March 17th, 2012 at 20:41 | #11

    @rock rock前辈,可不可以请教你一些分布式文件系统的问题?小弟邮箱 fangdong@pipul.org

    [Reply]

    Yu Feng Reply:

    我都在mryuufeng@gmail.com上, gtalk或者邮件都好。

    [Reply]

  12. wangjb
    April 1st, 2012 at 22:17 | #12

    问题来源:《Erlang编程指南》P171页。
    marco1.erl
    ******************************************
    -module(marco1).
    -compile(export_all).

    -ifdef(debug).
    -define(DBG(Str,Args),io:format(Str,Args)).
    -else.
    -define(DBG(Str,Args),ok).
    -endif.

    call(Request) ->
    ?DBG(“~p:call(~p) called~n”,[?MODULE,Request]).

    **************************************************
    用c(Module,[{d,debug}]).就好使。用compile:file(Module,[debug_info]).就不行.
    网上查了以下,例如:http://stackoverflow.com/questions/6830271/requesting-debug-info-in-an-erlang-module-using-compile
    好像是Erlang的一个bug。
    请指教!谢谢

    [Reply]

    Yu Feng Reply:

    Hi, 好

    这里要区分2个事情:
    1. {d,debug}是定义一个debug的宏。
    2. debug_info是指编译出来的beam带有符号信息。

    这是完全不同的事情,你之前的问题就在于混了这二样东西!

    参见这里:http://erldocs.com/R15B/compiler/compile.html?i=1&search=compile:#file/2

    [chuba]$erl
    Erlang R14B04 (erts-5.8.5) [64-bit] [smp:16:16] [rq:16] [async-threads:0] [hipe] [kernel-poll:false]

    Eshell V5.8.5 (abort with ^G)
    1> c(marco1,[{d,debug}]).
    {ok,marco1}
    2> m(marco1).
    Module marco1 compiled: Date: April 4 2012, Time: 07.13
    Compiler options: [export_all,{d,debug}]
    Object file: /home/chuba/marco1.beam
    Exports:
    call/1
    module_info/0
    module_info/1
    ok
    3> marco1:call(test).
    marco1:call(test) called
    ok
    4> compile:file(marco1,[debug_info, {d,debug}]).
    {ok,marco1}
    5> l(marco1).
    {module,marco1}
    6> m(marco1).
    Module marco1 compiled: Date: April 4 2012, Time: 07.14
    Compiler options: [export_all,debug_info,{d,debug}]
    Object file: /home/chuba/marco1.beam
    Exports:
    call/1
    module_info/0
    module_info/1
    ok
    7> marco1:call(test).
    marco1:call(test) called
    ok
    8>

    褚霸

    [Reply]

  13. April 8th, 2012 at 13:49 | #13

    我也关注这个话题,呵。

    PS: 看到留言里有人叫 余老师 。。。很容易想到 于老师 。。。于谦。。。

    [Reply]

  14. vincent
    April 20th, 2012 at 14:19 | #14

    霸爷,你好。一直在关注你的blog,受益良多。在此表示感谢。
    请求你能不能给个用rebar在windows平台上发布erlang的详细例子,
    我再网上找了好多资料,照做,结果在Windows平台发布出去的时候 总是提示调用的函数不存在
    (相关函数肯定都是有的)但在Linux上没问题 ,在Windows上使用rebar有什么特别的注意事项

    [Reply]

    Yu Feng Reply:

    最好在linux下玩。

    [Reply]

Comment pages
1 2 3 4 5 8 65
  1. No trackbacks yet.