- 博客(155)
- 收藏
- 关注
原创 erlang runtime system 内部文档(一)DelayedDealloc
延迟释放内存 问题: 怎样在多线程时中进行内存的管理呢?有个简单的方法:内存分配器给所有的线程分配和销毁内存的时候都被一个全局锁保护,但这会造成锁争,效率底下。那么给每个调度器单独的一个内存分配器实例呢,这样就避免了锁争,但是有这样一种情况,本线程创建的内存,有可能被其他线程正在使用,那么当内存需要销毁的时候怎么办呢。难道要等原线程的内存分配器不处在被锁状态才能释放?这样你等我...
2015-12-29 11:50:14
311
ssdb吐曹
用ssdb的时候没怎么看他的文档,听别人说是和redis的命令是一样的,协议也是一样的,客户端都可以用redis的,结果今天突然需要对hashmap设置expire,才发现redis能做到的ssdb居然做不到,ssdb的expire只可以对keyvalue的进行设置,而且删除hashmap也不能用del,需要用hclear(redis没这个命令)。太尴尬了。我逼得没办法只有把hashmap拆成一个...
2015-12-16 14:26:05
212
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
718
原创 tcpdump
1. tcpdump 要用root权限去运行。2. tcpdump的参数:-D 表示查看网络适配器列表-X 表示要显示抓取包的内容-s 0 表示显示全部包的内容-i 3 表示抓取网络适配器列表编号为3的设备tcp port 8080 表示抓取经过8080端口的tcp包...
2015-11-13 10:11:25
105
curl备忘
get:curl "http://www.test.com/test?a=123&b=asdf"post:curl -d "a=123&b=asdf" http://www.test.com/testurlencode:curl --data-urlencode "token=suVT7OcYi0FUrgOZoS+fpDnB8sN1lw==" http://...
2015-09-24 16:42:08
108
erlang的稳定连接池
连接池很好写,基本架构就是一个manager,在manager启动的时候负责创建链接并把连接存储到一个地方,然后每次请求过来都给出一个有效的连接。 为了保证效率,我采用了ets表,而没有用进程字典和queue作为存储连接的地方,为什么呢?因为ets表可以并发读和并发写,进程字典和queue速度是比ets快,但是只能有manager去访问,这样无形当中就形成了性能瓶颈,ets则可以N多个...
2015-09-16 10:30:11
215
erlang的GC(一)--binary
我自己写的文章居然被别人的博客转载了,然后大言不惭的说作者是他,真是服了。。。============================== 今天来说一下长期运行的项目会有内存越用越大的情况的发生原因。中所周知,erlang是运行在虚拟机上的,他的GC不是全局的而是针对进程单独GC。所以GC时整个系统不会产生中断,这是他的优点。那么既然有GC为什么还会有内存的增长呢??当我们运...
2015-08-31 17:02:01
590
git的命令备忘
1.clone a branch from git origin:git clone -b develop git@192.168.1.1:project2.create a new feature branch from this branchgit checkout -b feature-001 develop (从develop分支切出一个名为feature-001的分支,并...
2015-08-24 17:11:20
80
erlang mnesia的dirty_write详细分析
mnesia作为一个天生分布式的数据库,为保证各个节点数据的一致性,会对于每个非读操作进行节点间的数据同步。dirty_write也是要同步数据的,他和普通写操作的区别在于:1.对操作不加锁。2.同步数据请求不要求回执。这样就会大大的增强操作的执行效率。在调用dirty_write后,mnesia会给除自己以外的所有联通节点发送消息,告诉他们应该执行的操作,然后自己再执行mne...
2015-08-21 10:26:42
707
erlang的消息队列
erlang的消息队列做的很牛逼,erlang的每个进程都有个消息队列,当一个进程接收到消息后,就会存储在该进程的消息队列中,然后如果进程当前执行的代码有receive Partten,则会对当前消息队列中的消息进行匹配,如果匹配成功则这条消息就从消息队列中拿走了,如果该进程继续进行接收,那么会重新对整个消息队列进行匹配,直到找到符合要求的消息,如果所有消息都不符合要求则要么等待要么超时。所...
2015-08-10 17:24:04
581
erlang 列表推导和递归哪个速度快?
直接上代码:-module (tl).-export ([t1/0, t2/0]).t1() -> [ X || X <- lists:seq(1, 5000) ].t2() -> t2(lists:seq(1, 5000)).t2([H|T]) -> H, t2(T);t2([]) ->...
2015-08-03 23:18:59
498
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
444
erlang hibernate
在执行程序的时候,可以让不需要运行的进程进入休眠状态,erlang:hibernate,可以极大的减少内存和CPU的消耗,而当有消息专递给该进程后,则退出休眠状态。但是有几点要注意:1.进入hibernate的进程会清空调用堆栈,也就是说,进程执行到A函数内部,然后A函数调用B函数,然后进入休眠,当被唤醒的时候继续执行完成B函数后进程结束,而不会返回到A方法了。2.在休眠和唤醒过程中,e...
2015-07-31 11:31:41
428
什么时候用mnesia,进程字典,ets表
初学的时候关于这三个东西(mnesia,进程字典,ets表)总是感觉不知道到底怎么样但是感觉很厉害的样子,但是真正在开发的时候,是用mnesia还是进程字典还是ets表呢?我这段时间实际的工作经验来看:1.当我们需要在某个进程中频繁的访问很大块的数据的时候,推荐用进程字典,首先有4中方式可以达到目的:1.参数传递,进程的运行过程中,所有的函数的参数都带着这些数据。2.存在et...
2015-07-27 17:21:53
423
hadoop学习笔记
map参数中的key是什么:key是文件中的偏移量value是这行数据,context是负责hadoop map reduce之间数据的传递,所以map完成后要把结果写入到context中。为什么要用文件的偏移量做key呢,估计是为了reduce的时候能有个顺序吧。 写入context的结果也是key value对,比如word count,写入的key肯定就是word,va...
2015-07-20 19:14:32
107
如何用ruby来写hadoop的mapreduce并生成jar包
ruby来写hadoop的mapreduce,我用的方法是rubydoop。怎么配置环境呢:1.安装rvm: 不说了 网上有2.安装ruby: 由于我以前是做ruby的,所以习惯性的先安装了ruby,起码调试起来比jruby快多了。3.安装jruby: rvm install jruby然后等待安装完成4.给编写mapreduce的目录设置默认的r...
2015-07-17 19:09:15
224
rust的指针作为函数参数是直接传递,还是先销毁后创建?
这是我自己想到的问题,结果去知呼提问,还没等别人回答, 我自己就想到方法实验了。。fn main() { let mut a = 34; println!("a's addr:{:p}", &a); let p = &mut a; println!("p's addr:{:p}", &p); println!("o...
2015-07-17 18:03:47
925
原创 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
680
安装rvm后出现rvm not a function 或者ruby -v后提示没安装ruby的问题
1.在~/.bashrc最后加入[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" 2.重新启动terminal输入: rvm use ruby-2.2.1 --default 把当前安装的ruby版本设为默认使用。3.重新打开terminal后输入ruby -v 显示r...
2015-07-11 12:14:14
265
原创 rust学习笔记
1.rust里绑定变量是let,默认绑定了的变量是不可更改的,所以如果想让变量可变就要加上mut。let x = 1; let mut y = 2;2.match 相当于erlang中的case,但是case的每一项后都是分号,但是rust的match却是逗号。3.match 的每一项最后都要加逗号,但是最后一项不加也不会报错,所有结尾加逗号的用法都是类似。4.每个语句结尾都要...
2015-07-04 17:57:41
167
开发中遇到的诡异的bug
今天我们服务器组遇到个问题:我们的服务是从Kafka里面取出数据,然后把offset存储到ssdb中,每个topic和partition都对应ssdb中不同的key,服务启动之后,每次kafka数据更新我们这边收到消息,然后存储之后就发现ssdb的值偶尔是-2,这就奇怪了,最开始我们是在代码中打印存储的日志,发现没什么问题,后来去查看ssdb的日志,才发现里面每次set的时候都会对同一个ke...
2015-07-03 11:45:59
141
erlang supervisor分析
当我们给supervisor指定需要创建的子进程的时候,会指定M,F,A,如果是simple_one_for_one的策略的话,启动子进程的方式是supervisor:start_child(SupName, OtherArgs),这种方式可以根据调用者的需求传不同的参数给需要启动的子进程的方法。和最初的参数合并成一个数组,A ++ OtherArgs。那么这个时候就有个问题了,既然参数不一致,...
2015-07-02 19:01:35
127
sublime text 3 rust
1.sublime text 3 => install package => Rust2.cd ~/.config/sublime-text-3/Packages3.mkdir rust4.git clone https://github.com/sp0/rust-style5.cd rust-style6.cargo build --release7.ct...
2015-07-02 15:58:36
939
erlang输出调用栈信息
在erlang otp的开发中,如果调用第三方的应用,会有有些错误会不打印栈信息,因为有可能第三方应用会catch然后输出自己的错误信息,所以对排查bug有很大的阻碍,这样就要求我们自己打印调用的栈信息。用这个函数:erlang:process_display (self (), backtrace).需要注意这个函数只会输出到标准错误输出。也可以用这个函数:erlang:get_stack...
2015-07-01 17:01:52
1474
15.04禁用guest账户登录
sudo vim /usr/share/lightdm/lightdm.conf.d/50-unity-greeter.conf再结尾加一句话allow-guest=false
2015-06-29 18:44:26
115
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
262
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
95
原创 (转发)Linux内核 TCP/IP、Socket参数调优
/proc/sys/net目录所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失),例如下面这些重要的参数:参数(路径+文件)描述默认值优化值/proc/sys/net/core/rmem_default默认的TCP数...
2015-06-03 17:09:58
379
erlang websocket server 并发测试(二)
今天测试的内容是一次大量链接的情况:我的系统是ubuntu 14.04,如果什么都不设置,直接测试,大概同时链接在1000左右就是极限了,否则就会在客户端gen_tcp:connect时返回{error, eaddrinuse},但是我有个思路,linux在tcp握手的时候有用到两个队列,一个是存储客户端syn请求的队列,一个是给过客户端ack后的队列,我估计可能是客户端syn请求队列过小...
2015-06-03 16:57:45
199
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
240
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
545
原创 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
498
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人