原创文章,转载请注明: 转载自系统技术非业余研究
本文链接地址: 留言板
各位兄弟姐妹们,欢迎各种意见和建议,一起学习提高!
Post Footer automatically generated by wp-posturl plugin for wordpress.
handle_cast(retry, State) -> NewState = retry(State, ?RETRY_BATCH), {noreply, NewState, ?RETRY_INTERVAL};
NewState = retry(State, ?RETRY_BATCH), 这一句总是不执行 前后我加log后,中间空,无日志,这个函数也有日志,但是也没有任何输出,可否给个思路,大概是哪里的问题? 难道执行这一句没有任何反应,但是我看定义和调用就4处,还是不明白
[Reply]
Yu Feng Reply:April 25th, 2012 at 6:24 pm
把上下文贴出来吧
zdx3578 Reply:April 26th, 2012 at 4:08 pm
问题的确是retry漏了日志输出。多谢!
可能是这个bug。http://bugs.mysql.com/bug.php?id=61222 最近我测试也是遇到这个问题,我的mysql版本5.5.22-rel25.2-log Percona Server with XtraDB (GPL), Release rel25.2, Revision 237
不知道峰哥对这个版本有研究不?
峰哥:
麻烦你把贵站【Erlang中国】的域名由bbs.erlangchina.net 换成www.erlangchina.net
Yu Feng Reply:June 13th, 2012 at 6:31 pm
done
博主 你好。最近遇到一个棘手的问题,不知道如何解决,希望得到您的指点
最近在win7下erlang 总是出现类似如下的错误 eheap_alloc:Cannot allocate 43784 bytes of memory(of type “heap”) 发生这个情况的时候 从产生的erl_crash.dump看=memory total: 21789488 processes: 4496220 processes_used: 4491852 system: 17293268 atom: 437933 atom_used: 429402 binary: 391384 code: 3430903 ets: 12149036
机器物理内存还有几个G,在win7下尝试了R14A到最新的64位的R15都有这个问题 但在xp上从来没出现过这个情况 win7上频繁出现
Yu Feng Reply:June 15th, 2012 at 5:51 pm
windows我没有经验,但是看到上面的分配的值很小,应该是win7对进程级别的内存分配的限制。
峰老大,问个问题,RabbitMQ里面rabbit_networking.erl:269行, {ok, _Child, Reader} = supervisor:start_child(rabbit_tcp_client_sup, []), rabbit_tcp_client_sup这个参数从哪里来的,难道是(同文件139行) start() -> {ok,_} = supervisor2:start_child( rabbit_sup, {rabbit_tcp_client_sup, {rabbit_client_sup, start_link, [{local, rabbit_tcp_client_sup}, {rabbit_connection_sup,start_link,[]}]}, transient, infinity, supervisor, [rabbit_client_sup]}), ok. 这里已经的rabbit_tcp_client_sup 表示的Tag参数? 和supervisor2有关系吗,我用supervisor模拟了以个例子,好像不能这样用。 谢谢!!
Yu Feng Reply:June 25th, 2012 at 3:10 pm
我请我们团队的五藏专门看了下:
1. 这个参数的确在此处 2. 和supvisor2没有特别关系, supervisor也可以这么做
supervisor2:start_child( rabbit_sup, {rabbit_tcp_client_sup, {rabbit_client_sup, start_link, [{local, rabbit_tcp_client_sup}, {rabbit_connection_sup,start_link,[]}]}, transient, infinity, supervisor, [rabbit_client_sup]}), 在此处两个rabbit_tcp_client_sup含义不同,第一个表示该child 的Id,是rabbit_sup中的内部标识,而第二表示将rabbit_client_sup/start_link起动的进程注册名为rabbit_tcp_client_sup。 测试: -module(sub_sup). -behaviour(supervisor). -export([start_link/1]). -export([init/1]). -define(SERVER, ?MODULE). start_link(Name) -> supervisor:start_link(Name, ?MODULE, []). init([]) -> {ok, {{one_for_all, 0, 1}, []}}.
-module(sup). -behaviour(supervisor). -export([start_link/0,test/0]). -export([init/1]). -define(SERVER, ?MODULE). start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). init([]) -> {ok, {{one_for_all, 1, 1}, []}}. test()-> supervisor:start_child(?MODULE, {sub_sup1, {sub_sup, start_link,[{local, sub_sup1}]}, transient, infinity, supervisor, [sub_sup]}).
yuxiao Reply:June 25th, 2012 at 10:01 pm
谢谢峰老大,你的例子我明白,可能是我没有表述请求,其实我想问的是: {ok, _Child, Reader} = supervisor:start_child(rabbit_tcp_client_sup, []), 中,start_child这个函数的第一个参数一般是supervisor的模块名(我的理解是该子进程的容器sup,不知对不对???), 但整个RabbitMQ中,我就没有找到这个sup的定义(rabbit_tcp_client_sup). 但我发现这个函数: start() -> {ok,_} = supervisor2:start_child( rabbit_sup, {rabbit_tcp_client_sup, {rabbit_client_sup, start_link, [{local, rabbit_tcp_client_sup}, {rabbit_connection_sup,start_link,[]}]}, transient, infinity, supervisor, [rabbit_client_sup]}), ok. 所有才有我的疑问:将rabbit_client_sup/start_link起动的进程注册名为rabbit_tcp_client_sup后,rabbit_tcp_client_sup这个atom是否可作为start_child的第一个参数,起动相同的子进程(也就是rabbit_client_sup/start_link). 如果不行,那上{ok, _Child, Reader} = supervisor:start_child(rabbit_tcp_client_sup, [])的 rabbit_tcp_client_sup怎么样理解,它是从那里来的。 不然,将您给的例子sup中加上如下一个函数后:
-module(sup). -behaviour(supervisor). -export([start_link/0,test/0,test_1/0]). -export([init/1]). -define(SERVER, ?MODULE).
start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []).
init([]) -> {ok, {{one_for_all, 1, 1}, []}}.
test()-> supervisor:start_child(?MODULE, {sub_sup1, {sub_sup, start_link,[{local, sub_sup1}]}, transient, infinity, supervisor, [sub_sup]} ). test_1() -> supervisor:start_child(sub_sup1, []).
我运行的结果: Eshell V5.9.1 (abort with ^G) 1> sup:start_link(). {ok,} 2> sup:test(). {ok,} 3> sup:test_1(). {error,{invalid_child_spec,[]}} 4>
再次感谢!!!
yuxiao Reply:June 25th, 2012 at 10:26 pm
刚才根据{error,{invalid_child_spec,[]}}的提示invalid child spec修改如下这样: -module(sup). -behaviour(supervisor). -export([start_link/0,test/0,test_1/0]). -export([init/1]). -define(SERVER, ?MODULE).
test()-> supervisor:start_child(?MODULE, {sub_sup1, {sub_sup, start_link,[{local, sub_sup1}]}, transient, infinity, supervisor, [sub_sup]} ). test_1() -> X = {xxx, {sub_sup, start_link,[{local, sub_sup2}]}, transient, infinity, supervisor, [sub_sup]}, supervisor:start_child(sub_sup1, X).
竟然能运行, supervisor:start_child(sub_sup1, X).中的sub_sup1怎么理解??: Eshell V5.9.1 (abort with ^G) 1> sup:start_link(). {ok,} 2> sup:test(). {ok,} 3> sup:test_1(). {ok,} 4>
wuzang Reply:June 25th, 2012 at 11:07 pm
当然能运行,因为这里的sub_sup1也是个supvisor啊,在test中child的类型指定为supvisor sub_sup.erl的behaviour也是supvisor 运行sup:test/0后整棵监督树为 sup->sub_sup1 在继续运行sup:test_1/0收整棵监督树为 sup->sub_sup1->sub_sup2 这里sub_sup1是sup的child,也是sub_sup2的supervisor
在test中supvisor是sup,child的进程的注册名为sub_sup1,它在自己的supviosor “sup”中的ID为sub_sup1 在test_1中supvisor是sub_sup1,child进程的注册名为sub_sup2, 他在自己的supvisor “sub_sup1″中的ID为xxx
wuzang Reply:June 25th, 2012 at 11:13 pm
start_child这个函数的第一个参数一般是supervisor的模块名(我的理解是该子进程的容器sup,不知对不对???) 这句话不对,第一个参数不是模块名,是supvisor的进程名,是它注册的名称,比如在此例中模块为rabbit_client_sup,但注册的进程名为rabbit_tcp_client_sup.
yuxiao Reply:June 26th, 2012 at 9:19 pm
谢谢wuzang, 我明白了。
请求交换链接。技术博客 瀚海星空 http://abloz.com. 谢谢!
Yu Feng Reply:July 5th, 2012 at 2:22 pm
好。
你好。 最近我们的oracle 的listener 经常hang 住,pstack 看到的结果却仅仅只有一行: 0000000000000000 ???????? (0, 0, 0, 0, 0, 0) 我的问题是 1 在什么情况下 能产生这样的stack? 2 0000000000000000 是不是说明已经访问了NULL 指针? 3 出现了这种情况,为什么进程时hang 住而不是死掉呢?
我的solaris 版本是: 5.10 Generic_144488-04 sun4v sparc sun4v
还看到了一个类似的pstack, 在http://wesunsolve.net/bugid/id/7129513
谢谢霸爷!
Yu Feng Reply:July 16th, 2012 at 8:43 pm
pstack是gdb命令,你可以用gdb相信看下。 这种情况之前碰到过,但也没有去深究什么原因。有空我也研究下。
fan,zhihui Reply:July 18th, 2012 at 9:44 am
谢谢老大!
我是来膜拜高人的。 久慕霸爷之名。
Yu Feng Reply:September 5th, 2012 at 10:14 pm
呵呵,一起学习!
霸爷你好,我有一组db测试主从环境(192.168.1.11,192.168.1.12),不过我想请教的是关于网络的问题,我在192.168.1.11上执行sudo ethtool eth1以后,输出Speed: 1000Mb/s,我在192.168.1.12上执行也是输出Speed: 1000Mb/s,问题来了,当我换成百兆交换机的时候,在192.168.1.12上执行命令以后输出Speed: 100Mb/s,而在192.168.1.11上执行还是1000Mb/s,请教霸爷影响这个值的可能原因有哪些?
Yu Feng Reply:September 15th, 2012 at 10:55 am
用qperf这样的工具测试下真实流量把
请教大牛一个问题,项目急等应用。是关于服务器异常报错机制方面,希望对某进程的主循环函数做try catch之后,如果捕获到进程中异常后,希望能在代码中主动,产生crash dump文件,以便后续进行分析错误情况,但查过资料一直未能找到相关办法,我想你们应该有相关解决方案的吧,望不吝赐教,谢谢!
Yu Feng Reply:October 24th, 2012 at 10:36 pm
参看:erts/emulator/beam/break.c case ‘A’: /* Halt generating crash dump */ erl_exit(1, “Crash dump requested by user”); 想办法在nif里面调用erl_exit就好了。
zhangdong Reply:October 26th, 2012 at 11:00 am
绕到nif里去了,汗一个,正在努力攻破一次nif的简单调用,由于在windows环境下,erlang:load_nif所需要的c代码文件是dll,这个dll制作反倒成了难题了,建了个dll工程,写了个简单的给erlang调用的c函数,dll是编译出来了,erlang加载失败,错误信息的乱码,很郁闷啊
zhangdong Reply:October 29th, 2012 at 10:52 am
还在挣扎中,我按你的说法,nif调用简单例子测试通过了,但erl_exit函数所在的lib却不知道在哪,编译提示error LNK2019: 无法解析的外部符号 _erl_exit,请问你知道这个函数的lib是在哪个文件里?我应该要显示的#pragma comment ( lib, “xxx.lib” )吗?
你好,能请教个问题吗?我现在项目里用到了erlang的mnesia,请问你,有没有谁碰到过mnesia在不正常关闭情况下丢数据?
项目里用到了mnesia保存分库自增长id,mnesia做了cluster,但暂时测试的时候只起来了一个erlang程序,使用函数如下:
%get_key 通过 key(表id)返回最大的id值 get_key(Key) when is_atom(Key) -> F = fun() -> UID = case catch mnesia:wread({tab_unique_id, Key}) of [{_, Key, UID1}] -> UID2 = UID1 + 1, % io:format(“U:~p~n”, [UID1]), ok = mnesia:write(tab_unique_id, #ls_unique_id{tab_name=Key, uid=UID2}, write), UID2; _R -> UID2 = 1, % io:format(“R:~p~n”, [R]), ok = mnesia:write(tab_unique_id, #ls_unique_id{tab_name=Key, uid=UID2}, write), UID2 end, UID end, {atomic, UID2} = mnesia:transaction(F), UID2.
结构: -record(ls_unique_id, {tab_name, uid}) .
表: {tab_unique_id, [{record_name, ls_unique_id}, {attributes, record_info(fields, ls_unique_id)}, {disc_copies, [node()]}, {match, #ls_unique_id{_=’_’}}]}
问题: 现在关闭重启多次之后,返回的id会出现重复,导致数据库插入数据失败。 是函数写错了,还是什么其他问题。
霸爷,你好, 一直关注你的blog,当然一直也在潜水 🙂
我一直从事公司内部的数据存储引擎的开发工作,项目做了几年,看上去做的很健全,cs层和sql语法解析都有,都要做成个数据库了,但是底层存储做的很不精细,很多东西做的形似神不似,虽然目前的业务功能基本都能满足,但是一旦业务量增大,性能肯定就是瓶颈。看过一些mysql底层机制,想学着改改,但发现自己能力不够,改不动,它很多东西相互牵连,数据库这块有很多不懂。哎,最近这段时间,开发工作基本处于停滞状态,每天都是完善文档,看书和刷weibo,过的相当不踏实。
霸爷,你都做C开发做了15年了,肯定也碰到过这种情况吧,我要怎么调理啊。。。
Yu Feng Reply:November 12th, 2012 at 1:21 pm
这确实是很难的境地。我建议从项目里面跳出来,数据库引擎是个非常精细的活,涉及到系统的方方面面,很难在短时间内有突破。我建议去好好研究下目前的引擎如innodb引擎,狠狠心花个1-2年时间,吃透了一个,再回到你的项目,那时候就豁然开朗了。
coding farmer Reply:November 12th, 2012 at 1:30 pm
恩,是的,现在感觉就是个半吊子,什么都知道一点,其实什么都做不像样
Yu Feng Reply:November 12th, 2012 at 1:31 pm
干脆跳出来。。。
coding farmer Reply:November 12th, 2012 at 1:45 pm
跳槽,现在可能还不行,项目就3人,走了没人接
余老师,我刚开始着手erlang,拿到ringo的开源代码,按照他的说明却总是不能用,希望余老师能给自己指指路,自己在网上找不到资料。
余老师,我是刚刚开始学习erlang,这几天拿到ringo的源码,可是一直出问题: ================================================================ [root@tracvm ringo-master]# ./compile.sh [root@tracvm ringo-master]# ./create_node.sh tracvm /data/ringo/ root@tracvm’s password: [root@tracvm ringo-master]# echo “‘trurl’.” > ~/.hosts.erlang [root@tracvm ringo-master]# ./start_nodes.sh tracvm /data/ringo/ RINGO_ROOT is /root/work/ps/ringo-master root@tracvm’s password: Starting ringo-0b55f22fc1a2e4fec727d2ce1c3657bb root@tracvm’s password: Launching Ringo node [0b55f22fc1a2e4fec727d2ce1c3657bb] ================================================================ [root@tracvm ringo-master]# cd ringogw/ [root@tracvm ringogw]# ./start_ringogw.sh SCGI mode ================================================================ [root@tracvm ringogw]# curl -d “” http://localhost:15000/mon/data/foobar?create “Request timeout” [root@tracvm ringogw]# ================================================================ ringogw.log: =INFO REPORT==== 28-Nov-2012::22:10:45 === {“Ringo gateway starts (SCGI)”}
=INFO REPORT==== 28-Nov-2012::22:10:45 === {‘SCGI SERVER STARTS’}
=INFO REPORT==== 28-Nov-2012::22:11:13 === {“CREATE”,”foobar”,”WITH”,[{nrepl,3},{timeout,10000},{create,true}]} ================================================================ 这是我当时操作的步骤和现象,在网上也找不到有关的资料,余老师对这个了解的话,希望可以指导下我。
Yu Feng Reply:November 29th, 2012 at 12:09 pm
建议一开始玩点简单的如mochiweb这样的web服务器很容易测试和理解。
liufan Reply:November 29th, 2012 at 1:07 pm
谢谢,刚开始只是看书不知道怎么用erlang这个语言,所以想找个项目看看。谢谢余老师的建议。
@liufan [root@tracvm ringo-master]# echo “‘trurl’.” > ~/.hosts.erlang 这里写错了, [root@tracvm ringo-master]# echo “‘tracvm’.” > ~/.hosts.erlang 可还是出现 “Request timeout”
霸爷,我看你在CU采访中提到“余锋认为技术是随着业务量的增加而逐渐成熟起来的,京东和苏宁等电子商业网站正在经历这个过程。”,你真的觉得京东正在经历淘宝N年前的过程吗。现在有个机会去应聘京东云计算中心,但是我觉得京东没有技术基因,不太靠谱,不怕京东起步晚,技术薄弱,就怕京东没有这个做出一番事业的心气。很羡慕淘宝的这种公司,但是无奈不能离开南京。喜欢技术,希望用8到10年的努力,接近霸爷今天这种水平。
Yu Feng Reply:December 3rd, 2012 at 3:10 pm
技术确实需要业务的推到,但是前提是要有很好的态度,以数据说话的态度,和环境。我摘抄下我们核心系统的态度给你,你大概就明白了:
在回顾的同时,我也希望有更多的创新从核心系统的土壤里成长起来,有更好的技术服务和产品提供给我们的集团业务。为此,我希望大家和我一起:
一、专注:做基础技术的专家
我们坚持选拔一流的人才,坚持做一流人才的乐土,坚持我们的技术理念,专注地去做集团最需要我们去做的事情,持续钻研,不断提升我们的技术能力。希望将来,核心系统的每一个人走出去,都能够成为各个领域的资深专家。
二、服务:做业务问题的解决者
不能够应用于业务的技术不是好技术。为此,我们必须更加强调我们的服务意识,去贴近和了解业务,学会从业务使用者的角度来考虑技术问题,真正深入到业务之中去,解决好业务问题和需求,会让我们的服务和产品更有竞争力和生命力。这对我们来说非常重要。
三、创新:做技术创新的领跑者
技术创新可以创造更大的价值。创新从哪里来?需要从我们做业务问题解决者的敏感嗅觉中来,从我们的专注精神、过硬的技术能力中来。我们要不断挑战自己,做别人做不了的事情,我们一定会是最有技术活力的团队!
再来麻烦一次霸爷~ 最近在看mmap 的时候,man msync 看到 ” Without use of this call there is no guarantee that changes are written back before munmap(2) is called“ 。 kernel 通过哪个进程来不定期的sync mmap 的file ? 也是pdflush 吗?是否也受 vm.dirty_xxx 的价格参数影响?
另外,如果想用systemtap 来跟踪这种sync( kernel 的 和 自己调用msync 的) 要在哪设置probe?
Yu Feng Reply:December 18th, 2012 at 3:57 pm
VM有个writeback模块负责回写系统产生的dirty page,这当然包括mmap的页面。 这些probe可以参考tracepoint: writeback:writeback_nothread [Tracepoint event] writeback:writeback_queue [Tracepoint event] writeback:writeback_exec [Tracepoint event] writeback:writeback_pages_written [Tracepoint event] writeback:writeback_nowork [Tracepoint event] writeback:writeback_bdi_register [Tracepoint event] writeback:writeback_bdi_unregister [Tracepoint event] writeback:writeback_task_start [Tracepoint event] writeback:writeback_task_stop [Tracepoint event] writeback:wbc_writeback_start [Tracepoint event] writeback:wbc_writeback_written [Tracepoint event] writeback:wbc_writeback_wait [Tracepoint event] writeback:wbc_balance_dirty_start [Tracepoint event] writeback:wbc_balance_dirty_written [Tracepoint event] writeback:wbc_balance_dirty_wait [Tracepoint event] writeback:wbc_writepage [Tracepoint event]
fan,zhihui Reply:December 19th, 2012 at 11:48 am
谢谢霸爷,根据您的提示找到了很多好东西。 但还有点问题, 一般情况下, user process 写了一个数据, 对应的page cache 就会变成dirty block,但并不等待 write 到磁盘才结束, 这样看似乎IO 性能不影响 用户的响应时间。 但这肯定是不对的。真正的原因为什么disk IO performance 差 就影响了 user process 的响应时间 是这样的吗? 1 pdflush 写dirty block 到disk 的时候, 这些dirty block 会被lock 住,所以不能被更改,所以需要等待。 2 当dirty block 达到一个百分比, user process 就不能被再更改。也需要等待。 如果是, 这个百分比受谁控制?
看您的了解IO协议栈,IO request queue 放的是什么? 如果用msync(.., MS_SYNC)去同步dirty block, 会到哪一层完成才算结束?
需要注意的是/*! */ 这种格式,对于MySQL来说不是注释,是能够直接执行的。同时这个格式还支持指定版本号,比如/*!50518 xxxx*/ 表示,若server端版本大于5518,则后续的xxxx作为语句的一部分执行,否则忽略。
参考他手下的这篇文章:http://dinglin.iteye.com/blog/1749273
余老大,最近用fprof测试了一下代码,但发现出来的结果跟文档说的有些不一样,有些地方看不懂,想请教一下。版本是15B {[{{gen_server,loop,6}, 19032,241853.009, 82.853}], { {gen_server,decode_msg,8}, 19032,241853.009, 82.853}, % [{{gen_server,handle_msg,5}, 19032, 0.101, 127.558}]}. 比如这里是其中一个函数的段,为啥handle_msg的时间花费这么少的,加上82.853远远少于241853.009。 还有这里, {[{undefined, 3808,299958.911, 10.263}, {{mod_scene_manager,update_player_grid,3}, 3808, 0.003, 10.292}, {{mod_scene_manager,merge_data_to_slices,3}, 86634, 0.000, 220.628}], { {erlang,put,2}, 94250,299958.914, 241.183}, % [{{mod_scene_manager,update_player_grid,3}, 0,299948.579, 6.913}, {garbage_collect, 197, 4.110, 4.110}]}. 很明显erlang:put 是没有调用过update_player_grid(而是update_player_grid调用了erlang:put), 调用次数也显示了0次,但是却显示erlang:put的时间主要花在update_player_grid上面。搞不懂了!!!!
余老大,在使用erl_call 的时候遇见erl_call: can’t resolve hostname VM_15_101 这种问题,是什么原因呢,是在虚拟机上,采用节点间切换没有问题,
Yu Feng Reply:February 25th, 2013 at 6:14 pm
域名VM_15_101 解释不了呀。 ping VM_15_101 看看
霸爷,小弟想请教您一个问题:小弟现在做一个把asp.net的平台转移到apache+mono+mod_mono上,目前遇到之前的网页目录和文件有大小写的问题,将其放在Linux上,这些路径的大小写则会出现问题,我曾尝试着打开check-spelling模块,在配置文件里打开亦无法解决这个问题。求救有更改好的解决方法吗?
Yu Feng Reply:February 27th, 2013 at 2:00 pm
还是修改大小写吧
Δ
handle_cast(retry, State) ->
NewState = retry(State, ?RETRY_BATCH),
{noreply, NewState, ?RETRY_INTERVAL};
NewState = retry(State, ?RETRY_BATCH), 这一句总是不执行 前后我加log后,中间空,无日志,这个函数也有日志,但是也没有任何输出,可否给个思路,大概是哪里的问题? 难道执行这一句没有任何反应,但是我看定义和调用就4处,还是不明白
[Reply]
Yu Feng Reply:
April 25th, 2012 at 6:24 pm
把上下文贴出来吧
[Reply]
zdx3578 Reply:
April 26th, 2012 at 4:08 pm
问题的确是retry漏了日志输出。多谢!
[Reply]
可能是这个bug。http://bugs.mysql.com/bug.php?id=61222
最近我测试也是遇到这个问题,我的mysql版本5.5.22-rel25.2-log Percona Server with XtraDB (GPL), Release rel25.2, Revision 237
不知道峰哥对这个版本有研究不?
[Reply]
峰哥:
麻烦你把贵站【Erlang中国】的域名由bbs.erlangchina.net 换成www.erlangchina.net
[Reply]
Yu Feng Reply:
June 13th, 2012 at 6:31 pm
done
[Reply]
博主 你好。最近遇到一个棘手的问题,不知道如何解决,希望得到您的指点
最近在win7下erlang 总是出现类似如下的错误
eheap_alloc:Cannot allocate 43784 bytes of memory(of type “heap”)
发生这个情况的时候 从产生的erl_crash.dump看=memory
total: 21789488
processes: 4496220
processes_used: 4491852
system: 17293268
atom: 437933
atom_used: 429402
binary: 391384
code: 3430903
ets: 12149036
机器物理内存还有几个G,在win7下尝试了R14A到最新的64位的R15都有这个问题
但在xp上从来没出现过这个情况 win7上频繁出现
[Reply]
Yu Feng Reply:
June 15th, 2012 at 5:51 pm
windows我没有经验,但是看到上面的分配的值很小,应该是win7对进程级别的内存分配的限制。
[Reply]
峰老大,问个问题,RabbitMQ里面rabbit_networking.erl:269行, {ok, _Child, Reader} = supervisor:start_child(rabbit_tcp_client_sup, []), rabbit_tcp_client_sup这个参数从哪里来的,难道是(同文件139行)
start() ->
{ok,_} = supervisor2:start_child(
rabbit_sup,
{rabbit_tcp_client_sup,
{rabbit_client_sup, start_link,
[{local, rabbit_tcp_client_sup},
{rabbit_connection_sup,start_link,[]}]},
transient, infinity, supervisor, [rabbit_client_sup]}),
ok.
这里已经的rabbit_tcp_client_sup 表示的Tag参数? 和supervisor2有关系吗,我用supervisor模拟了以个例子,好像不能这样用。
谢谢!!
[Reply]
Yu Feng Reply:
June 25th, 2012 at 3:10 pm
我请我们团队的五藏专门看了下:
1. 这个参数的确在此处
2. 和supvisor2没有特别关系, supervisor也可以这么做
supervisor2:start_child(
rabbit_sup,
{rabbit_tcp_client_sup,
{rabbit_client_sup, start_link,
[{local, rabbit_tcp_client_sup},
{rabbit_connection_sup,start_link,[]}]},
transient, infinity, supervisor, [rabbit_client_sup]}),
在此处两个rabbit_tcp_client_sup含义不同,第一个表示该child 的Id,是rabbit_sup中的内部标识,而第二表示将rabbit_client_sup/start_link起动的进程注册名为rabbit_tcp_client_sup。
测试:
-module(sub_sup). -behaviour(supervisor). -export([start_link/1]). -export([init/1]). -define(SERVER, ?MODULE). start_link(Name) -> supervisor:start_link(Name, ?MODULE, []). init([]) -> {ok, {{one_for_all, 0, 1}, []}}.
-module(sup). -behaviour(supervisor). -export([start_link/0,test/0]). -export([init/1]). -define(SERVER, ?MODULE). start_link() -> supervisor:start_link({local, ?SERVER}, ?MODULE, []). init([]) -> {ok, {{one_for_all, 1, 1}, []}}. test()-> supervisor:start_child(?MODULE, {sub_sup1, {sub_sup, start_link,[{local, sub_sup1}]}, transient, infinity, supervisor, [sub_sup]}).
[Reply]
yuxiao Reply:
June 25th, 2012 at 10:01 pm
谢谢峰老大,你的例子我明白,可能是我没有表述请求,其实我想问的是:
{ok, _Child, Reader} = supervisor:start_child(rabbit_tcp_client_sup, []), 中,start_child这个函数的第一个参数一般是supervisor的模块名(我的理解是该子进程的容器sup,不知对不对???), 但整个RabbitMQ中,我就没有找到这个sup的定义(rabbit_tcp_client_sup).
但我发现这个函数:
start() ->
{ok,_} = supervisor2:start_child(
rabbit_sup,
{rabbit_tcp_client_sup,
{rabbit_client_sup, start_link,
[{local, rabbit_tcp_client_sup},
{rabbit_connection_sup,start_link,[]}]},
transient, infinity, supervisor, [rabbit_client_sup]}),
ok.
所有才有我的疑问:将rabbit_client_sup/start_link起动的进程注册名为rabbit_tcp_client_sup后,rabbit_tcp_client_sup这个atom是否可作为start_child的第一个参数,起动相同的子进程(也就是rabbit_client_sup/start_link). 如果不行,那上{ok, _Child, Reader} = supervisor:start_child(rabbit_tcp_client_sup, [])的 rabbit_tcp_client_sup怎么样理解,它是从那里来的。
不然,将您给的例子sup中加上如下一个函数后:
-module(sup).
-behaviour(supervisor).
-export([start_link/0,test/0,test_1/0]).
-export([init/1]).
-define(SERVER, ?MODULE).
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
init([]) ->
{ok, {{one_for_all, 1, 1}, []}}.
test()->
supervisor:start_child(?MODULE,
{sub_sup1,
{sub_sup, start_link,[{local, sub_sup1}]},
transient, infinity, supervisor, [sub_sup]}
).
test_1() ->
supervisor:start_child(sub_sup1, []).
我运行的结果:
Eshell V5.9.1 (abort with ^G)
1> sup:start_link().
{ok,}
2> sup:test().
{ok,}
3> sup:test_1().
{error,{invalid_child_spec,[]}}
4>
再次感谢!!!
[Reply]
yuxiao Reply:
June 25th, 2012 at 10:26 pm
刚才根据{error,{invalid_child_spec,[]}}的提示invalid child spec修改如下这样:
-module(sup).
-behaviour(supervisor).
-export([start_link/0,test/0,test_1/0]).
-export([init/1]).
-define(SERVER, ?MODULE).
start_link() ->
supervisor:start_link({local, ?SERVER}, ?MODULE, []).
init([]) ->
{ok, {{one_for_all, 1, 1}, []}}.
test()->
supervisor:start_child(?MODULE,
{sub_sup1,
{sub_sup, start_link,[{local, sub_sup1}]},
transient, infinity, supervisor, [sub_sup]}
).
test_1() ->
X = {xxx, {sub_sup, start_link,[{local, sub_sup2}]},
transient, infinity, supervisor, [sub_sup]},
supervisor:start_child(sub_sup1, X).
竟然能运行, supervisor:start_child(sub_sup1, X).中的sub_sup1怎么理解??:
Eshell V5.9.1 (abort with ^G)
1> sup:start_link().
{ok,}
2> sup:test().
{ok,}
3> sup:test_1().
{ok,}
4>
wuzang Reply:
June 25th, 2012 at 11:07 pm
当然能运行,因为这里的sub_sup1也是个supvisor啊,在test中child的类型指定为supvisor
sub_sup.erl的behaviour也是supvisor
运行sup:test/0后整棵监督树为
sup->sub_sup1
在继续运行sup:test_1/0收整棵监督树为
sup->sub_sup1->sub_sup2
这里sub_sup1是sup的child,也是sub_sup2的supervisor
在test中supvisor是sup,child的进程的注册名为sub_sup1,它在自己的supviosor “sup”中的ID为sub_sup1
在test_1中supvisor是sub_sup1,child进程的注册名为sub_sup2, 他在自己的supvisor “sub_sup1″中的ID为xxx
wuzang Reply:
June 25th, 2012 at 11:13 pm
start_child这个函数的第一个参数一般是supervisor的模块名(我的理解是该子进程的容器sup,不知对不对???)
这句话不对,第一个参数不是模块名,是supvisor的进程名,是它注册的名称,比如在此例中模块为rabbit_client_sup,但注册的进程名为rabbit_tcp_client_sup.
yuxiao Reply:
June 26th, 2012 at 9:19 pm
谢谢wuzang, 我明白了。
请求交换链接。技术博客 瀚海星空 http://abloz.com. 谢谢!
[Reply]
Yu Feng Reply:
July 5th, 2012 at 2:22 pm
好。
[Reply]
你好。
最近我们的oracle 的listener 经常hang 住,pstack 看到的结果却仅仅只有一行:
0000000000000000 ???????? (0, 0, 0, 0, 0, 0)
我的问题是
1 在什么情况下 能产生这样的stack?
2 0000000000000000 是不是说明已经访问了NULL 指针?
3 出现了这种情况,为什么进程时hang 住而不是死掉呢?
我的solaris 版本是: 5.10 Generic_144488-04 sun4v sparc sun4v
还看到了一个类似的pstack, 在http://wesunsolve.net/bugid/id/7129513
谢谢霸爷!
[Reply]
Yu Feng Reply:
July 16th, 2012 at 8:43 pm
pstack是gdb命令,你可以用gdb相信看下。 这种情况之前碰到过,但也没有去深究什么原因。有空我也研究下。
[Reply]
fan,zhihui Reply:
July 18th, 2012 at 9:44 am
谢谢老大!
[Reply]
我是来膜拜高人的。 久慕霸爷之名。
[Reply]
Yu Feng Reply:
September 5th, 2012 at 10:14 pm
呵呵,一起学习!
[Reply]
霸爷你好,我有一组db测试主从环境(192.168.1.11,192.168.1.12),不过我想请教的是关于网络的问题,我在192.168.1.11上执行sudo ethtool eth1以后,输出Speed: 1000Mb/s,我在192.168.1.12上执行也是输出Speed: 1000Mb/s,问题来了,当我换成百兆交换机的时候,在192.168.1.12上执行命令以后输出Speed: 100Mb/s,而在192.168.1.11上执行还是1000Mb/s,请教霸爷影响这个值的可能原因有哪些?
[Reply]
Yu Feng Reply:
September 15th, 2012 at 10:55 am
用qperf这样的工具测试下真实流量把
[Reply]
请教大牛一个问题,项目急等应用。是关于服务器异常报错机制方面,希望对某进程的主循环函数做try catch之后,如果捕获到进程中异常后,希望能在代码中主动,产生crash dump文件,以便后续进行分析错误情况,但查过资料一直未能找到相关办法,我想你们应该有相关解决方案的吧,望不吝赐教,谢谢!
[Reply]
Yu Feng Reply:
October 24th, 2012 at 10:36 pm
参看:erts/emulator/beam/break.c
case ‘A’: /* Halt generating crash dump */
erl_exit(1, “Crash dump requested by user”);
想办法在nif里面调用erl_exit就好了。
[Reply]
zhangdong Reply:
October 26th, 2012 at 11:00 am
绕到nif里去了,汗一个,正在努力攻破一次nif的简单调用,由于在windows环境下,erlang:load_nif所需要的c代码文件是dll,这个dll制作反倒成了难题了,建了个dll工程,写了个简单的给erlang调用的c函数,dll是编译出来了,erlang加载失败,错误信息的乱码,很郁闷啊
[Reply]
zhangdong Reply:
October 29th, 2012 at 10:52 am
还在挣扎中,我按你的说法,nif调用简单例子测试通过了,但erl_exit函数所在的lib却不知道在哪,编译提示error LNK2019: 无法解析的外部符号 _erl_exit,请问你知道这个函数的lib是在哪个文件里?我应该要显示的#pragma comment ( lib, “xxx.lib” )吗?
[Reply]
你好,能请教个问题吗?我现在项目里用到了erlang的mnesia,请问你,有没有谁碰到过mnesia在不正常关闭情况下丢数据?
项目里用到了mnesia保存分库自增长id,mnesia做了cluster,但暂时测试的时候只起来了一个erlang程序,使用函数如下:
%get_key 通过 key(表id)返回最大的id值
get_key(Key) when is_atom(Key) ->
F = fun() ->
UID =
case catch mnesia:wread({tab_unique_id, Key}) of
[{_, Key, UID1}] ->
UID2 = UID1 + 1,
% io:format(“U:~p~n”, [UID1]),
ok = mnesia:write(tab_unique_id, #ls_unique_id{tab_name=Key, uid=UID2}, write),
UID2;
_R ->
UID2 = 1,
% io:format(“R:~p~n”, [R]),
ok = mnesia:write(tab_unique_id, #ls_unique_id{tab_name=Key, uid=UID2}, write),
UID2
end,
UID
end,
{atomic, UID2} = mnesia:transaction(F),
UID2.
结构:
-record(ls_unique_id, {tab_name, uid}) .
表:
{tab_unique_id,
[{record_name, ls_unique_id},
{attributes, record_info(fields, ls_unique_id)},
{disc_copies, [node()]},
{match, #ls_unique_id{_=’_’}}]}
问题:
现在关闭重启多次之后,返回的id会出现重复,导致数据库插入数据失败。
是函数写错了,还是什么其他问题。
[Reply]
霸爷,你好, 一直关注你的blog,当然一直也在潜水 🙂
我一直从事公司内部的数据存储引擎的开发工作,项目做了几年,看上去做的很健全,cs层和sql语法解析都有,都要做成个数据库了,但是底层存储做的很不精细,很多东西做的形似神不似,虽然目前的业务功能基本都能满足,但是一旦业务量增大,性能肯定就是瓶颈。看过一些mysql底层机制,想学着改改,但发现自己能力不够,改不动,它很多东西相互牵连,数据库这块有很多不懂。哎,最近这段时间,开发工作基本处于停滞状态,每天都是完善文档,看书和刷weibo,过的相当不踏实。
霸爷,你都做C开发做了15年了,肯定也碰到过这种情况吧,我要怎么调理啊。。。
[Reply]
Yu Feng Reply:
November 12th, 2012 at 1:21 pm
这确实是很难的境地。我建议从项目里面跳出来,数据库引擎是个非常精细的活,涉及到系统的方方面面,很难在短时间内有突破。我建议去好好研究下目前的引擎如innodb引擎,狠狠心花个1-2年时间,吃透了一个,再回到你的项目,那时候就豁然开朗了。
[Reply]
coding farmer Reply:
November 12th, 2012 at 1:30 pm
恩,是的,现在感觉就是个半吊子,什么都知道一点,其实什么都做不像样
[Reply]
Yu Feng Reply:
November 12th, 2012 at 1:31 pm
干脆跳出来。。。
coding farmer Reply:
November 12th, 2012 at 1:45 pm
跳槽,现在可能还不行,项目就3人,走了没人接
[Reply]
余老师,我刚开始着手erlang,拿到ringo的开源代码,按照他的说明却总是不能用,希望余老师能给自己指指路,自己在网上找不到资料。
[Reply]
余老师,我是刚刚开始学习erlang,这几天拿到ringo的源码,可是一直出问题:
================================================================
[root@tracvm ringo-master]# ./compile.sh
[root@tracvm ringo-master]# ./create_node.sh tracvm /data/ringo/
root@tracvm’s password:
[root@tracvm ringo-master]# echo “‘trurl’.” > ~/.hosts.erlang
[root@tracvm ringo-master]# ./start_nodes.sh tracvm /data/ringo/
RINGO_ROOT is /root/work/ps/ringo-master
root@tracvm’s password:
Starting ringo-0b55f22fc1a2e4fec727d2ce1c3657bb
root@tracvm’s password:
Launching Ringo node [0b55f22fc1a2e4fec727d2ce1c3657bb]
================================================================
[root@tracvm ringo-master]# cd ringogw/
[root@tracvm ringogw]# ./start_ringogw.sh
SCGI mode
================================================================
[root@tracvm ringogw]# curl -d “” http://localhost:15000/mon/data/foobar?create
“Request timeout”
[root@tracvm ringogw]#
================================================================
ringogw.log:
=INFO REPORT==== 28-Nov-2012::22:10:45 ===
{“Ringo gateway starts (SCGI)”}
=INFO REPORT==== 28-Nov-2012::22:10:45 ===
{‘SCGI SERVER STARTS’}
=INFO REPORT==== 28-Nov-2012::22:11:13 ===
{“CREATE”,”foobar”,”WITH”,[{nrepl,3},{timeout,10000},{create,true}]}
================================================================
这是我当时操作的步骤和现象,在网上也找不到有关的资料,余老师对这个了解的话,希望可以指导下我。
[Reply]
Yu Feng Reply:
November 29th, 2012 at 12:09 pm
建议一开始玩点简单的如mochiweb这样的web服务器很容易测试和理解。
[Reply]
liufan Reply:
November 29th, 2012 at 1:07 pm
谢谢,刚开始只是看书不知道怎么用erlang这个语言,所以想找个项目看看。谢谢余老师的建议。
[Reply]
@liufan
[root@tracvm ringo-master]# echo “‘trurl’.” > ~/.hosts.erlang
这里写错了,
[root@tracvm ringo-master]# echo “‘tracvm’.” > ~/.hosts.erlang
可还是出现
“Request timeout”
[Reply]
霸爷,我看你在CU采访中提到“余锋认为技术是随着业务量的增加而逐渐成熟起来的,京东和苏宁等电子商业网站正在经历这个过程。”,你真的觉得京东正在经历淘宝N年前的过程吗。现在有个机会去应聘京东云计算中心,但是我觉得京东没有技术基因,不太靠谱,不怕京东起步晚,技术薄弱,就怕京东没有这个做出一番事业的心气。很羡慕淘宝的这种公司,但是无奈不能离开南京。喜欢技术,希望用8到10年的努力,接近霸爷今天这种水平。
[Reply]
Yu Feng Reply:
December 3rd, 2012 at 3:10 pm
技术确实需要业务的推到,但是前提是要有很好的态度,以数据说话的态度,和环境。我摘抄下我们核心系统的态度给你,你大概就明白了:
在回顾的同时,我也希望有更多的创新从核心系统的土壤里成长起来,有更好的技术服务和产品提供给我们的集团业务。为此,我希望大家和我一起:
一、专注:做基础技术的专家
我们坚持选拔一流的人才,坚持做一流人才的乐土,坚持我们的技术理念,专注地去做集团最需要我们去做的事情,持续钻研,不断提升我们的技术能力。希望将来,核心系统的每一个人走出去,都能够成为各个领域的资深专家。
二、服务:做业务问题的解决者
不能够应用于业务的技术不是好技术。为此,我们必须更加强调我们的服务意识,去贴近和了解业务,学会从业务使用者的角度来考虑技术问题,真正深入到业务之中去,解决好业务问题和需求,会让我们的服务和产品更有竞争力和生命力。这对我们来说非常重要。
三、创新:做技术创新的领跑者
技术创新可以创造更大的价值。创新从哪里来?需要从我们做业务问题解决者的敏感嗅觉中来,从我们的专注精神、过硬的技术能力中来。我们要不断挑战自己,做别人做不了的事情,我们一定会是最有技术活力的团队!
[Reply]
再来麻烦一次霸爷~
最近在看mmap 的时候,man msync 看到 ” Without use of this call there is no guarantee that changes are written back before munmap(2) is called“ 。 kernel 通过哪个进程来不定期的sync mmap 的file ? 也是pdflush 吗?是否也受 vm.dirty_xxx 的价格参数影响?
另外,如果想用systemtap 来跟踪这种sync( kernel 的 和 自己调用msync 的) 要在哪设置probe?
[Reply]
Yu Feng Reply:
December 18th, 2012 at 3:57 pm
VM有个writeback模块负责回写系统产生的dirty page,这当然包括mmap的页面。 这些probe可以参考tracepoint:
writeback:writeback_nothread [Tracepoint event]
writeback:writeback_queue [Tracepoint event]
writeback:writeback_exec [Tracepoint event]
writeback:writeback_pages_written [Tracepoint event]
writeback:writeback_nowork [Tracepoint event]
writeback:writeback_bdi_register [Tracepoint event]
writeback:writeback_bdi_unregister [Tracepoint event]
writeback:writeback_task_start [Tracepoint event]
writeback:writeback_task_stop [Tracepoint event]
writeback:wbc_writeback_start [Tracepoint event]
writeback:wbc_writeback_written [Tracepoint event]
writeback:wbc_writeback_wait [Tracepoint event]
writeback:wbc_balance_dirty_start [Tracepoint event]
writeback:wbc_balance_dirty_written [Tracepoint event]
writeback:wbc_balance_dirty_wait [Tracepoint event]
writeback:wbc_writepage [Tracepoint event]
[Reply]
fan,zhihui Reply:
December 19th, 2012 at 11:48 am
谢谢霸爷,根据您的提示找到了很多好东西。 但还有点问题,
一般情况下, user process 写了一个数据, 对应的page cache 就会变成dirty block,但并不等待 write 到磁盘才结束, 这样看似乎IO 性能不影响 用户的响应时间。 但这肯定是不对的。真正的原因为什么disk IO performance 差 就影响了 user process 的响应时间 是这样的吗?
1 pdflush 写dirty block 到disk 的时候, 这些dirty block 会被lock 住,所以不能被更改,所以需要等待。
2 当dirty block 达到一个百分比, user process 就不能被再更改。也需要等待。 如果是, 这个百分比受谁控制?
看您的了解IO协议栈,IO request queue 放的是什么? 如果用msync(.., MS_SYNC)去同步dirty block, 会到哪一层完成才算结束?
[Reply]
需要注意的是/*! */ 这种格式,对于MySQL来说不是注释,是能够直接执行的。同时这个格式还支持指定版本号,比如/*!50518 xxxx*/ 表示,若server端版本大于5518,则后续的xxxx作为语句的一部分执行,否则忽略。
参考他手下的这篇文章:http://dinglin.iteye.com/blog/1749273
[Reply]
余老大,最近用fprof测试了一下代码,但发现出来的结果跟文档说的有些不一样,有些地方看不懂,想请教一下。版本是15B
{[{{gen_server,loop,6}, 19032,241853.009, 82.853}],
{ {gen_server,decode_msg,8}, 19032,241853.009, 82.853}, %
[{{gen_server,handle_msg,5}, 19032, 0.101, 127.558}]}.
比如这里是其中一个函数的段,为啥handle_msg的时间花费这么少的,加上82.853远远少于241853.009。
还有这里,
{[{undefined, 3808,299958.911, 10.263},
{{mod_scene_manager,update_player_grid,3}, 3808, 0.003, 10.292},
{{mod_scene_manager,merge_data_to_slices,3}, 86634, 0.000, 220.628}],
{ {erlang,put,2}, 94250,299958.914, 241.183}, %
[{{mod_scene_manager,update_player_grid,3}, 0,299948.579, 6.913},
{garbage_collect, 197, 4.110, 4.110}]}.
很明显erlang:put 是没有调用过update_player_grid(而是update_player_grid调用了erlang:put), 调用次数也显示了0次,但是却显示erlang:put的时间主要花在update_player_grid上面。搞不懂了!!!!
[Reply]
余老大,在使用erl_call 的时候遇见erl_call: can’t resolve hostname VM_15_101 这种问题,是什么原因呢,是在虚拟机上,采用节点间切换没有问题,
[Reply]
Yu Feng Reply:
February 25th, 2013 at 6:14 pm
域名VM_15_101 解释不了呀。 ping VM_15_101 看看
[Reply]
霸爷,小弟想请教您一个问题:小弟现在做一个把asp.net的平台转移到apache+mono+mod_mono上,目前遇到之前的网页目录和文件有大小写的问题,将其放在Linux上,这些路径的大小写则会出现问题,我曾尝试着打开check-spelling模块,在配置文件里打开亦无法解决这个问题。求救有更改好的解决方法吗?
[Reply]
Yu Feng Reply:
February 27th, 2013 at 2:00 pm
还是修改大小写吧
[Reply]