`
wudixiaotie
  • 浏览: 132008 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
这就是链接:Big If
延迟释放内存   问题:   怎样在多线程时中进行内存的管理呢?有个简单的方法:内存分配器给所有的线程分配和销毁内存的时候都被一个全局锁保护,但这会造成锁争,效率底下。那么给每个调度器单独的一个内存分配器实例呢,这样就避免了锁争,但是有这样一种情况,本线程创建的内存,有可能被其他线程正在使用,那么当内存需要销毁的时候怎么办呢。难道要等原线程的内存分配器不处在被锁状态才能释放?这样你等我,我等他的还是效率底下啊。   解决方案:   为了减少由内存分配器引起的锁争,我们给每个调度器进程一个无锁状态的内存分配器,给非调度器的进程一个有锁的内存分配器。调度器在erlang虚拟机be ...
用ssdb的时候没怎么看他的文档,听别人说是和redis的命令是一样的,协议也是一样的,客户端都可以用redis的,结果今天突然需要对hashmap设置expire,才发现redis能做到的ssdb居然做不到,ssdb的expire只可以对keyvalue的进行设置,而且删除hashmap也不能用del,需要用hclear(redis没这个命令)。太尴尬了。我逼得没办法只有把hashmap拆成一个一个的keyvalue对来设置过期时间了。

erlang常用的函数

erlang:phash2(Term[, Range]) -> Hash :: integer()   返回跟项元 Term 相关,范围在 0 至 Range - 1 间的一个 hash 数值,Range 的取值范围是 1 至 2^32 之间:   erlang:phash2(test, 10000).  2948   缺少第二个参数 Range 时,将返回一个 0 至 2^27 - 1 hash 数值: erlang:phash2(now()).  56249308

tcpdump

1. tcpdump 要用root权限去运行。 2. tcpdump的参数: -D 表示查看网络适配器列表 -X 表示要显示抓取包的内容 -s 0 表示显示全部包的内容 -i 3 表示抓取网络适配器列表编号为3的设备 tcp port 8080 表示抓取经过8080端口的tcp包

curl备忘

get: curl "http://www.test.com/test?a=123&b=asdf" post: curl -d "a=123&b=asdf" http://www.test.com/test urlencode: curl --data-urlencode "token=suVT7OcYi0FUrgOZoS+fpDnB8sN1lw==" http://localhost:8080/server/reconnect
连接池很好写,基本架构就是一个manager,在manager启动的时候负责创建链接并把连接存储到一个地方,然后每次请求过来都给出一个有效的连接。   为了保证效率,我采用了ets表,而没有用进程字典和queue作为存储连接的地方,为什么呢?因为ets表可以并发读和并发写,进程字典和queue速度是比ets快,但是只能有manager去访问,这样无形当中就形成了性能瓶颈,ets则可以N多个进程同时去读,没有瓶颈,在并发的情况下比进程字典和queue快了不是1倍2倍。   在erlang中大部分数据库driver的连接都是一个进程,我们拿到的都是这个进程的PID,拿postgresql ...
  我自己写的文章居然被别人的博客转载了,然后大言不惭的说作者是他,真是服了。。。 ==============================  今天来说一下长期运行的项目会有内存越用越大的情况的发生原因。中所周知,erlang是运行在虚拟机上的, ...

git的命令备忘

1.clone a branch from git origin: git clone -b develop git@192.168.1.1:project 2.create a new feature branch from this branch git checkout -b feature-001 develop (从develop分支切出一个名为feature-001的分支,并切换到该分支) 3.finish git checkout develop (切换当前分支到develop) git pull (更新本地分支) git diff --name-status d ...
mnesia作为一个天生分布式的数据库,为保证各个节点数据的一致性,会对于每个非读操作进行节点间的数据同步。 dirty_write也是要同步数据的,他和普通写操作的区别在于: 1.对操作不加锁。 2.同步数据请求不要求回执。 这 ...

erlang的消息队列

erlang的消息队列做的很牛逼,erlang的每个进程都有个消息队列,当一个进程接收到消息后,就会存储在该进程的消息队列中,然后如果进程当前执行的代码有receive Partten,则会对当前消息队列中的消息进行匹配,如果匹配成功则 ...
直接上代码: -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([]) -> ok.  tc代码: %% =================================================================== %% Author x ...
mnesia有2种方式脏读数据,一种是以Key的方式用dirty_read(Tab, Key),一种是以其他建立索引的字段读取dirty_index_read(Tab, OtherKey, Position).最开始以为这两个的速度是一样的,结果一侧是发现第一种是第二种的将近3倍。测试是用1千万的数据,10万的进程并发访问。 测试用的代码: -module (tm). -behaviour (gen_server). % APIs -export([start_link/0, find/1, find1/1, ct/0, ct1/0]). % gen_server c ...

erlang hibernate

在执行程序的时候,可以让不需要运行的进程进入休眠状态,erlang:hibernate,可以极大的减少内存和CPU的消耗,而当有消息专递给该进程后,则退出休眠状态。但是有几点要注意: 1.进入hibernate的进程会清空调用堆栈,也就是说,进程执行到A函数内部,然后A函数调用B函数,然后进入休眠,当被唤醒的时候继续执行完成B函数后进程结束,而不会返回到A方法了。 2.在休眠和唤醒过程中,erlang会对进程进行GC,也就是2次GC。所以erlang不推荐在业务非常繁忙的应用中频繁的进行进程休眠,但是经过我的测试休眠和唤醒过程中所耗费的资源远远小于维持一个tcp gen_server的资源 ...
初学的时候关于这三个东西(mnesia,进程字典,ets表)总是感觉不知道到底怎么样但是感觉很厉害的样子, 但是真正在开发的时候,是用mnesia还是进程字典还是ets表呢? 我这段时间实际的工作经验来看: 1.当我们需要在某个 ...
Global site tag (gtag.js) - Google Analytics