![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
erlang
wudixiaotie
这个作者很懒,什么都没留下…
展开
-
erlang关于Pattern Matching the Fields of a Map
```erlang 1> Henry8 = #{ class => king, born => 1491, died => 1547 }. #{ born => 1491, class=> king, died => 1547 }.2> #{ born => B } = Henry8.#{ born => 1491,...2014-12-06 10:54:01 · 115 阅读 · 0 评论 -
erlang hibernate
在执行程序的时候,可以让不需要运行的进程进入休眠状态,erlang:hibernate,可以极大的减少内存和CPU的消耗,而当有消息专递给该进程后,则退出休眠状态。但是有几点要注意:1.进入hibernate的进程会清空调用堆栈,也就是说,进程执行到A函数内部,然后A函数调用B函数,然后进入休眠,当被唤醒的时候继续执行完成B函数后进程结束,而不会返回到A方法了。2.在休眠和唤醒过程中,e...2015-07-31 11:31:41 · 418 阅读 · 0 评论 -
什么时候用mnesia,进程字典,ets表
初学的时候关于这三个东西(mnesia,进程字典,ets表)总是感觉不知道到底怎么样但是感觉很厉害的样子,但是真正在开发的时候,是用mnesia还是进程字典还是ets表呢?我这段时间实际的工作经验来看:1.当我们需要在某个进程中频繁的访问很大块的数据的时候,推荐用进程字典,首先有4中方式可以达到目的:1.参数传递,进程的运行过程中,所有的函数的参数都带着这些数据。2.存在et...2015-07-27 17:21:53 · 408 阅读 · 0 评论 -
erlang simple_one_for_one监控策略
在工作的时候遇到过这样的问题,由simple_one_for_one的supervisor创建的所有子进程在supervisor挂掉后不会被重启,才想到simple_one_for_one的supervisor会有这个隐患,同事提出个解决方案,把simple_one_for_one换成one_for_one,每次想动态子进程也可以调用supervisor:start_child。这个是个不错的...原创 2015-07-17 00:23:02 · 666 阅读 · 0 评论 -
ubuntu下编译ejabberd需要的依赖
libexpat1-dev (缺少expat.h)libyaml-dev (缺少yaml.h)2015-07-10 18:40:42 · 152 阅读 · 0 评论 -
erlang supervisor分析
当我们给supervisor指定需要创建的子进程的时候,会指定M,F,A,如果是simple_one_for_one的策略的话,启动子进程的方式是supervisor:start_child(SupName, OtherArgs),这种方式可以根据调用者的需求传不同的参数给需要启动的子进程的方法。和最初的参数合并成一个数组,A ++ OtherArgs。那么这个时候就有个问题了,既然参数不一致,...2015-07-02 19:01:35 · 121 阅读 · 0 评论 -
erlang输出调用栈信息
在erlang otp的开发中,如果调用第三方的应用,会有有些错误会不打印栈信息,因为有可能第三方应用会catch然后输出自己的错误信息,所以对排查bug有很大的阻碍,这样就要求我们自己打印调用的栈信息。用这个函数:erlang:process_display (self (), backtrace).需要注意这个函数只会输出到标准错误输出。也可以用这个函数:erlang:get_stack...2015-07-01 17:01:52 · 1457 阅读 · 0 评论 -
erlang 部署
1.如果在启动节点的时候报这个错 :{"init terminating in do_boot",{'cannot load',elf_format,get_files}}则需要在reltool.config中加入{app, hipe, [{incl_cond, exclude}]}, 2.当generate时,遇到:ERROR: Failed to genera...2015-06-29 16:53:09 · 253 阅读 · 0 评论 -
erlang supervisor
定义supervisor时,如果是监控celuesimple_one_for_one则删除children的时候就用supervisor:terminate_child (SupModuleName, ChildPid),如果shutdown策略选择的是brutal_kill,那么supervisor会调用exit(ChildPid, kill),这样的话如果Child的behavior是gen...2015-06-24 17:07:21 · 87 阅读 · 0 评论 -
erlang mnesia 脏读性能测试
mnesia有2种方式脏读数据,一种是以Key的方式用dirty_read(Tab, Key),一种是以其他建立索引的字段读取dirty_index_read(Tab, OtherKey, Position).最开始以为这两个的速度是一样的,结果一侧是发现第一种是第二种的将近3倍。测试是用1千万的数据,10万的进程并发访问。测试用的代码:-module (tm).-behavi...2015-08-03 16:01:59 · 434 阅读 · 0 评论 -
erlang的消息队列
erlang的消息队列做的很牛逼,erlang的每个进程都有个消息队列,当一个进程接收到消息后,就会存储在该进程的消息队列中,然后如果进程当前执行的代码有receive Partten,则会对当前消息队列中的消息进行匹配,如果匹配成功则这条消息就从消息队列中拿走了,如果该进程继续进行接收,那么会重新对整个消息队列进行匹配,直到找到符合要求的消息,如果所有消息都不符合要求则要么等待要么超时。所...2015-08-10 17:24:04 · 572 阅读 · 0 评论 -
关于列表相加\
```erlangA = [{a,0},{b,0},{c,1}].B = [{x,0},{y,0},{z,1}]. C = [A|B] % C=[[{a,0},{b,0},{c,1}],{x,0},{y,0},{z,1}].```因为 [A|B] 的意思是把A作为一个列表元素加入到新的列表中。所以是列表嵌套着列表。如果是列表相加那么可以这么写:```erlang...2014-12-05 22:20:19 · 122 阅读 · 0 评论 -
erlang bit
二进制当然是以位为单位的。一个字节(byte)是8位(bit),一位就是一个(0或1)。定义二进制是<<E1,E2,....,EN>>,每个逗号区分一个片段。一个片段的组成是这样的:Value:Size/Type,Size和Type可疑不写。一个片段的长度是Size*Unit。binary的长度必须是8的整数倍。integer,float,bitstring,bits...2014-12-03 19:20:18 · 118 阅读 · 0 评论 -
About Tail Recursion(关于尾递归)
为了锻炼英语水平,为以后出国工作提前准备,我就用英文写了,也没查字典,可能有语法错误,欢迎大家指正。。When we have to recursion we always prefer to use loop rather than recursion. Because when the recursion goes deep the stack will always overflo...2014-12-01 10:28:45 · 98 阅读 · 0 评论 -
erlang runtime system 内部文档(一)DelayedDealloc
延迟释放内存 问题: 怎样在多线程时中进行内存的管理呢?有个简单的方法:内存分配器给所有的线程分配和销毁内存的时候都被一个全局锁保护,但这会造成锁争,效率底下。那么给每个调度器单独的一个内存分配器实例呢,这样就避免了锁争,但是有这样一种情况,本线程创建的内存,有可能被其他线程正在使用,那么当内存需要销毁的时候怎么办呢。难道要等原线程的内存分配器不处在被锁状态才能释放?这样你等我...原创 2015-12-29 11:50:14 · 300 阅读 · 0 评论 -
erlang常用的函数
erlang:phash2(Term[, Range]) -> Hash :: integer() 返回跟项元 Term 相关,范围在 0 至 Range - 1 间的一个 hash 数值,Range 的取值范围是 1 至 2^32 之间: erlang:phash2(test, 10000). 2948 缺少第二个参数 Range 时,将返回一个 0 至 2...2015-12-14 11:16:20 · 700 阅读 · 0 评论 -
erlang的稳定连接池
连接池很好写,基本架构就是一个manager,在manager启动的时候负责创建链接并把连接存储到一个地方,然后每次请求过来都给出一个有效的连接。 为了保证效率,我采用了ets表,而没有用进程字典和queue作为存储连接的地方,为什么呢?因为ets表可以并发读和并发写,进程字典和queue速度是比ets快,但是只能有manager去访问,这样无形当中就形成了性能瓶颈,ets则可以N多个...2015-09-16 10:30:11 · 208 阅读 · 0 评论 -
erlang的GC(一)--binary
我自己写的文章居然被别人的博客转载了,然后大言不惭的说作者是他,真是服了。。。============================== 今天来说一下长期运行的项目会有内存越用越大的情况的发生原因。中所周知,erlang是运行在虚拟机上的,他的GC不是全局的而是针对进程单独GC。所以GC时整个系统不会产生中断,这是他的优点。那么既然有GC为什么还会有内存的增长呢??当我们运...2015-08-31 17:02:01 · 575 阅读 · 0 评论 -
erlang mnesia的dirty_write详细分析
mnesia作为一个天生分布式的数据库,为保证各个节点数据的一致性,会对于每个非读操作进行节点间的数据同步。dirty_write也是要同步数据的,他和普通写操作的区别在于:1.对操作不加锁。2.同步数据请求不要求回执。这样就会大大的增强操作的执行效率。在调用dirty_write后,mnesia会给除自己以外的所有联通节点发送消息,告诉他们应该执行的操作,然后自己再执行mne...2015-08-21 10:26:42 · 694 阅读 · 0 评论 -
erlang gen_server
call的时候可以设定timeout,超时了之后gen_server就死掉了。2015-06-18 11:13:50 · 90 阅读 · 0 评论 -
erlang websocket server 并发测试(二)
今天测试的内容是一次大量链接的情况:我的系统是ubuntu 14.04,如果什么都不设置,直接测试,大概同时链接在1000左右就是极限了,否则就会在客户端gen_tcp:connect时返回{error, eaddrinuse},但是我有个思路,linux在tcp握手的时候有用到两个队列,一个是存储客户端syn请求的队列,一个是给过客户端ack后的队列,我估计可能是客户端syn请求队列过小...2015-06-03 16:57:45 · 190 阅读 · 0 评论 -
erlang mnesia备忘
所有表:mnesia:table_info(schema, tables).原创 2015-05-23 21:47:05 · 75 阅读 · 0 评论 -
erlang socket
erlang中负责监听的socket如果坏掉了(所在的进程崩溃或者结束,从而被垃圾回收等),由它生成的socket会全部结束。2015-01-25 04:20:40 · 173 阅读 · 0 评论 -
erlang scheduler && SMP
scheduler是erlang的调度器,是为了解决erlang程序在多核cpu的计算机上运行能同时让每个cpu都能处理的问题,也就是解决多cpu编程的问题。整个的解决方案应该叫SMP。同一个代码,如果不进行处理在某些语言里,只能在某个cpu下运行,如果这个计算机有8个CPU那么,有7个是空闲的,这就大大的浪费了资源。在启动erlang的时候,操作系统会告诉erlang,这台计算机有几个...2015-01-20 21:59:51 · 306 阅读 · 0 评论 -
erlang report browser
```erlangerl -boot start_sasl -config elogrb:start().rb:list().error_logger:error_msg("this is an error~n").rb:list().```这段代码执行完后发现rb显示的东西没什么变化,后来才发现,需要rb:rescan()刷新。...2015-01-13 21:40:22 · 120 阅读 · 0 评论 -
erlang monitor & demonitor
如果一个进程Pid1调用monitor监控Pid2,那么如果Pid2无论崩溃还是自然死亡,活着Pid1崩溃或自然死亡,这个监控的Ref都会自动被erlang牛逼虚拟机回收。原创 2015-01-13 21:36:55 · 246 阅读 · 0 评论 -
erlang常用方法
1.同步所有节点的代码nl().2.fun Mod:Fun/1 等同于 fun(Any) -> Mod:Fun(Any) end3.让注册过的进程退出用whereis/1找到进程id,然后才能用exit/2让其退出:exit(whereis(Name), kill)....原创 2015-01-13 21:36:34 · 114 阅读 · 0 评论 -
erlang 异常
关于异常:throw的异常是try catch能捕捉到的,也是程序猿希望捕捉到的。exit和error是try catch 捕捉不到的,遇到这个进程会直接崩溃。error表示错误非常严重,而且是不可预料的,进程必须崩溃来避免更严重的错误发生。 exit是为了通知其他与之关联的进程’我死了,你看着办!’如果设置了process_flag(trap_exit, true),与它的...2015-01-11 13:53:04 · 90 阅读 · 0 评论 -
erlang mnesia
mnesia:1.查询语句如果是用qlc来编译查询语句的话需要在module中引用qlc库的头文件:-include_lib("stdlib/include/qlc.hrl”). 2.一个表的默认主见就是record声明的第一个属性,更新和删除操作都是以他为依据的例如表名为users的表删除时:```erlang-record(users, {id, name, addr...2015-01-11 13:52:17 · 125 阅读 · 0 评论 -
erlang spawn_link
```erlang-module (test).-compile(export_all). a() -> PidB = spawn_link(fun() -> b() end), PidC = spawn_link(fun() -> c() end), {PidB, PidC}.b() -> receive...2015-01-11 13:48:02 · 526 阅读 · 0 评论 -
erlang 二进制合并
erlang的二进制合并:```erlangB1 = <<1, 2>>.B2 = <<3, 4>>.B3 = [B1, B2].B4 = list_to_binary([B1, B2]).```B3和B4都是合并,不过B3是个列表,B4是二进制,但是如果是进行网络传输的话,gen_tcp:send方法会把所有的term转...2015-01-30 12:00:15 · 751 阅读 · 0 评论 -
websocket
websocket 握手后Frame 的封装是不一样的,客户端发送的东西是要掩码的,但是服务端发送的就不用掩码,发送方如果数据的长度是小于125,则取长度的单位是第二个字节的后七位,如果长度是大于125小于等于65535(1111,1111,1111,1111),则长度就是第三个字节和第四个字节(共两个字节),而且第二个字节后七位必须是126,如果长度大于65535(1111,1111,1111,...2015-01-31 17:07:14 · 86 阅读 · 0 评论 -
erlang websocket server 并发测试
项目地址:gatling(https://github.com/wudixiaotie/gatling)1.首先去除系统限制:http://wudixiaotie.iteye.com/blog/22133422.3个erlang shell作为client 一个erlang shell 作为服务端。3个client shell每个启动30000个websocket client。每个c...2015-05-22 17:19:35 · 236 阅读 · 0 评论 -
erlang 最大的tcp连接数
1.同时打开的端口数量限制(Open ports):system_info (port_limit).erlang对同时打开的端口数量做出了限制。默认是65536, 可以通过环境变量ERL_MAX_PORTS修改,或者配置erlang启动参数(标志+Q)修改。(说明:在OTP17以后的版本就会移除环境变量ERL_MAX_PORTS的支持)2.同时打开的文件和socket数量限制...2015-05-21 20:32:01 · 537 阅读 · 0 评论 -
ubuntu下编译安装erlang otp 18.1
1.tar -zxf otp_src_18.1.tar.gz2.cd otp_src_18.13.export ERL_TOP=`pwd`4../configure --without-javac如果中途退出提示:configure: error: No curses library functions foundconfigure: error: /bin/bash '....原创 2015-05-20 21:01:07 · 489 阅读 · 0 评论 -
在ubuntu下删除erlang
如果用apt-get的方式安装的erlang,想删除的化很简单:1.which erl2.sudo rm -rf /usr/bin/erl3.sudo rm -rf /usr/lib/erlang2015-05-20 20:17:49 · 4707 阅读 · 1 评论 -
erlang的调试工具
application的监控:appmon,processes的监控:pman,debugger,tables 的监控(table viewer):tv,toolbar:可以启动以上四个的小工具。 查看进程数目:erlang:system_info(process_count).查看节点的内存消耗:erlang:memory().查看同时打开的文件和socket...2015-05-08 13:44:18 · 178 阅读 · 0 评论 -
(转发)erlang的限制
http://blog.csdn.net/mycwq/article/details/174742112015-05-03 13:44:33 · 101 阅读 · 0 评论 -
erlang gen_server的一个困惑
如果用gen_server,那么必须要在启动的时候给他个名字,这个名字是为了register。可是,如果我要做一个游戏的后端,同时会有几十万上百万的gen_server进程,那么光是名字用到的atom就已经超过atom table的限制了阿(max=1048576),这要怎么办呢??难道不用gen_server??或者在启动的时候扩大atom table的最大容量(erl -t size)??...原创 2015-05-03 13:42:48 · 135 阅读 · 0 评论 -
erlang tcp 最大链接数
erlang单个节点的一个端口的tcp最大链接数取决于两个方面:1.取决于单个文件的io句柄数,用```erlangerlang:system_info(check_io).```里面的{max_fds, 1024}查看。2.单个port的最大链接数:```erlangerlang:system_info(port_limit).```查看。 ...2015-02-05 17:58:59 · 290 阅读 · 0 评论