留言板

原创文章,转载请注明: 转载自Erlang非业余研究

本文链接地址: 留言板

各位兄弟姐妹们,流言飞语都来吧, 俺不怕!

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

  1. 文通
    March 8th, 2011 at 11:32 | #1

    霸爷,这个blog是咋整的?
    要申请独立域名么?

    [Reply]

    Yu Feng Reply:

    申请个独立域名再申请个空间,找个人合用,差不多1年7-8百?

    [Reply]

  2. xumingyong
    March 16th, 2011 at 09:19 | #2

    记得 余锋 介绍过gprof的一些用法,我在网络搜索过程中发现了几个好工具:
    valgrind –tool = callgrind & kcachegrind

    也很不错。有空请也介绍介绍其详细用法。

    [Reply]

  3. 卓华
    March 25th, 2011 at 14:09 | #3

    在网龙呆得怎么样》?游戏上线了吗?在哪里可以玩到?

    [Reply]

    Yu Feng Reply:

    那是很久以前的事情了.

    [Reply]

  4. April 22nd, 2011 at 16:10 | #4

    霸爷,挺你来了!

    [Reply]

  5. cavaluo
    May 6th, 2011 at 12:01 | #5

    汗。。。。锋爷也跑杭州去了吗?

    [Reply]

  6. May 27th, 2011 at 10:05 | #6

    希望老大把在erlang项目中使用lua的例子分享一下,我一直想把lua应用在erlang上,但一直不知道怎么个用法!

    [Reply]

    Yu Feng Reply:

    其实lua更多的是用于c项目的灵活性配置,或者需要用户参与的地方。

    [Reply]

  7. qianye
    June 14th, 2011 at 09:27 | #7

    余老师,我刚学erlang,想请教一个问题。我用erlang试做一个登陆系统的时候,想加一个动态验证码,但是我发现erlang里好像没有生成动态图片的函数。网上有一个GD库的erlang绑定,但好像用起来并不像PHP里面那么方便。

    我想问一问有没有其他方案可以绕过去,比如利用PHP生成图片,然后再传给erlang,或者直接用PHP生成注册登陆系统,erlang做他擅长的事情。

    [Reply]

    Yu Feng Reply:

    可以在php代码在生成图片的同时,通过http通知erlang模块inets或者mochiweb,告诉它图片的内容。

    [Reply]

  8. June 15th, 2011 at 09:45 | #8

    wordpress 技术博客路过。
    在ppt文档看到你博客。 mysql调优。

    [Reply]

    Yu Feng Reply:

    谢谢关注!

    [Reply]

  9. July 20th, 2011 at 20:02 | #9

    如题

    [Reply]

    Yu Feng Reply:

    肯定支持呀,lvs的作者就是我老大,我们的cdn大量用

    [Reply]

  10. 马亮
    July 29th, 2011 at 14:20 | #10

    老兄:
    几年前,你发过一个帖子。http://www.iteye.com/topic/105086
    关于FMS的性能问题。
    请教一下,您最后所说的“竞争对手的产品 2000个连接的时候cpu才30-40”,指的是RED5,还是其他竞争对手?

    [Reply]

    Yu Feng Reply:

    red5

    [Reply]

    马亮 Reply:

    近期来看,貌似FMS性能比RED5好。 RED5是java写的嘛,一直很担心其性能。而FMS底层应该是C++写的。
    我其实很想知道那些大网站比如youku,tudou用的是什么流媒体服务器?还是根本就是http方式访问?

    [Reply]

    Yu Feng Reply:

    近期听说fms换了个帮子写代码,质量好很多了。。。

  11. xuexxd
    August 9th, 2011 at 14:26 | #11

    强大峰哥,baidu、google一下,除了爱立信那三个人的资料,就是你的最多了,

    [Reply]

  12. xuexxd
    August 9th, 2011 at 14:30 | #12

    这些天在学习erlang,先看完erlang programing,然后就查erlang VM的资料学习,和smp、Process绑定调度器还是绑定cpu核,等资料;
    感谢峰哥的贡献!

    [Reply]

  13. expp
    August 9th, 2011 at 18:06 | #13

    hi yufeng,
    学习erlang有一段时间了,随着学习的深入,问题也越来越多,以前很多不懂得地方google, baidu到的solution大部分是你和litao cheng的,最近刚刚利用sasl把代码的热升级,降级搞好了,整合到了系统中,对于热升级的具体实现,我猜测erlang虚拟机内是否维护了old_code & new_code的两个指针,指向正确的代码地址. 代码的第一个版本编译后,old_code = null, 热替换成版本2后,old_code指向版本1, new_code = current, 然后编译器需要更新global export table, 根据函数调用方式M:F()
    或者F()来确定代码地址?

    [Reply]

    Yu Feng Reply:

    对的,erlang代码是这样升级的,除了这个还有驱动程序动态库以及erts自身的升级,不大相同。。。

    [Reply]

    expp Reply:

    动态库和erts自身如何实现的?
    我有很多问题别说中文了,英文的资料都少的可怜,有些在老外的邮件列表里能找到答案,
    其他的估计只能自己研读source code了,
    在emulator/beam里找到了如下的数据结构
    typedef struct erl_module {
    IndexSlot slot; int module;
    BeamInstr* code;
    BeamInstr* old_code;
    int code_length;
    int old_code_length;
    unsigned catches, old_catches;
    struct erl_module_nif* nif;
    struct erl_module_nif* old_nif;
    } Module;
    看来 BeamInstr* code; BeamInstr* old_code; 就是干这事的……

    [Reply]

  14. October 12th, 2011 at 13:07 | #14

    顶 霸爷!
    PS1 : 大连校招时被你面试过一面。
    PS2 : 我们的博客风格好雷同啊….

    [Reply]

    Yu Feng Reply:

    这么巧?

    [Reply]

    nash635 Reply:

    PS3:我学弟在你们部门工作

    [Reply]

  15. 陈杨希
    October 16th, 2011 at 01:59 | #15

    我想问一下,为何我用tsung测Mysql就会出1043错误呢?哪怕是最简单的show tables。我的tsung版本是1.4.1,mysql版本是5.1.59-community

    [Reply]

    Yu Feng Reply:

    方便的话,麻烦把步骤和出错信息发email给我. 当然你也可以 If you add the attribute dumptraffic=”true”, all the traffic will be logged to a file. Warn: this will considerably slow down Tsung, so use with care. It is useful for debugging purpose. 参看这里: http://tsung.erlang-projects.org/user_manual.html

    看日志就知道什么原因了。

    [Reply]

  16. lyxing
    October 21st, 2011 at 14:58 | #16

    你好!请教一个问题:在mysqldump的文件中有大量的注释(不知是否为hint)里边的内容包含数字:
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
    /*!40103 SET TIME_ZONE=’+00:00′ */;
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=’NO_AUTO_VALUE_ON_ZERO’ */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

    请问这些数字有什么含义?

    [Reply]

  17. jhelp
    November 9th, 2011 at 09:34 | #17

    请问可以详细讲一些针对mysql执行计划比较,sql优化方面的吗?

    [Reply]

  18. 刘峰林
    November 21st, 2011 at 16:22 | #18

    峰哥,我现在用ejabberd做手机服务器,因为ejabberd没有像java那样的preparestatement.
    所以在插入数据库的时候需要拼成一条SQL语句,在拼成一条SQL语句的时候如果数据中含有单引号” ‘ “,或者分号”;”,那就比较悲剧了,直接可以做SQL注入,系统无半点安全可言啦,请问您有没有遇到过同样的问题,指点一下迷津,呵呵.

    [Reply]

    Yu Feng Reply:

    不能改写ejabberd吗?

    [Reply]

    刘峰林 Reply:

    目前想到的方案是在ejabberd中做字符串替换,把特殊字符都处理一下,但这样效率肯会比较低,呵呵

    [Reply]

    Yu Feng Reply:

    这个貌似很不优雅。。。

    刘峰林 Reply:

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

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

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

    [Reply]

    Yu Feng Reply:

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

    [Reply]

    qinlinwang Reply:

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

    [Reply]

    Yu Feng Reply:

    那还是把语法好好学学吧

    qinlinwang Reply:

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

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

    我想问下,在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]

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

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

    [Reply]

    Yu Feng Reply:

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

    [Reply]

    Jiecong Reply:

    谢了,余老大

    [Reply]

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

    霸主,你好.我刚刚学习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倍。

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

    霸主,再问你一个小小的问题.就是我看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的回收是针对每个进程进行的。

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

    霸主,我终于解决了之前那个大日志的问题了.竟然是因为我的正则表达式的一点小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:

    多核上运行应该快很多~

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

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

    [Reply]

    Yu Feng Reply:

    re模块支持binary

    [Reply]

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

    余锋老大,请教个问题:
    我有这么个应用场景:一个程序每秒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也试了。。。

Comment pages
1 2 65
  1. No trackbacks yet.