自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Sunface撩技术

大道至简,技术如歌,欢迎来到Sunface的博客,https://im.dev

  • 博客(35)
  • 收藏
  • 关注

原创 erlang网络编程的几个性能调优和注意点

前些天给echo_server写了个非常简单的连接压力测试程序, 代码 -module(stress_test).      -export([start/0, tests/1]).     start() ->       tests(12345).      tests(Port) ->       io:format("starting~n"),      spa

2013-06-29 13:07:09 1695

转载 erlang节点间通信使用erlang send 和使用gen_tcp socket性能的对比(

在erlang开发中使用erlang send是比较方便的,但是性能相比使用socket会有多大的损失呢。 测试程序:    客户端:        1.使用erlang send  发送1M次数据,每次一个整数        2.使用gen_tcp连接,发送1M次数据,每次一个整数    服务器端:        基于ranch socket框架,开发简单的socke

2013-06-21 11:51:37 2563

原创 hibernate的妙用

关于erlang进程hibernate的好处,去过这次erlang大会的同学应该已经都知道了简单的理解: hibernate可以使你闲置的erlang进程马上进行gc,因为进程处于receive状态下是不会gc的 我在性能调优时发现,gc对于消息发送速度的影响还是非常大的 关于erlang gc问题也可以参看这个 引用Recently, as part of

2013-06-20 15:06:00 1713

转载 从FTP模块学习先进的诊断技术(Erlang Trace机制)

从FTP模块学习先进的诊断技术(Erlang Trace机制) 我们开发好了一个软件的时候,通常是经过严格测试的,才分发给用户使用, 但是即使这样也不能保证用户的环境和我们的相同, 我们的软件还是会失败的. 问题是如何诊断这些问题.通常的做法是写log,这是个很有效的方式. 但是写log要代码支持,而且会带来负面的性能影响. Erlang提供了强大的Trace机制, 帮助我们解决这个问

2013-06-08 21:22:12 1684

原创 gen系列init使用注意事项

gen*都需要callback模块提供一个init模块, 在这个模块里面做相应的初始化操作.我们以gen_server为例子. 当我们调用gen_server:start_link的时候,  底层会委托proc_lib来启动新的进程同时调用我们的init函数进行初始化.  同时gen系列会同步等待新进程初始化完毕, 才接着往下执行.我们看下文档:gen_server:start_l

2013-06-08 21:21:56 1983

原创 erlang throw跳出递归的妙用

To put exceptions in practice, we'll do a little exercise requiring us to dig for ourtree module. We're going to add a function that lets us do a lookup in the tree to find out whether a value is al

2013-06-08 21:21:55 2036

原创 Ubuntu常用命令大全

Ubuntu常用命令大全Ubuntu常用命令大全查看软件xxx安装内容#dpkg -L xxx查找软件#apt-cache search 正则表达式查找文件属于哪个包#dpkg -S filename apt-file search filename查询软件xxx依赖哪些包#apt-cache depends xxx查询软件xxx被哪些包依赖#apt

2013-06-08 21:21:36 3849

原创 Erlang R15的内存delayed dealloc特性对消息密集型程序的影响

在新的NUMA体系结构下,每个CPU都有自己的本地内存,如果要访问其他CPU的内存,那算remote了,要走CPU之间的QPI通道,通常这样速度会有40%的下降。那么对于多线程的程序来讲,这个硬件的变化对软件也有很大的影响。在多线程程序里面,通常一个线程会为一个对象分配内存,然后把这个对象传递到不同的线程去使用,最后由其他线程释放内存。而这二个线程可能在不同的CPU上运行,这个场景很普遍,比如

2013-06-07 13:49:56 1488

原创 Erlang epmd的角色以及使用

很多同学误会了epmd的作用,认为epmd就是erlang集群的协议,我来澄清下:Epmd是Erlang Port Mapper Daemon的缩写,在Erlang集群中的作用相当于dns的作用,提供节点名称到端口的查询服务,epmd绑定在总所周知的4369端口上。epmd文档:http://www.erlang.org/doc/man/epmd.htmlepmd协议:http://w

2013-06-07 13:44:22 2587

原创 Erlang port巧用环境变量

Erlang与外面世界的交互主要通过port来进行的,特别是和外部程序的协作,通常是通过管道进行的。基本上有2种方法可以调用外部程序: 1. os:cmd 2. erlang:open_port, 这二种方式各有利弊,先看文档:os:cmd的文档参见这里cmd(Command) -> string()Types:Command = atom() | io_lib:cha

2013-06-07 13:42:21 2444

原创 Erlang open_port极度影响性能的因素

Erlang的port相当于系统的IO,打开了Erlang世界通往外界的通道,可以很方便的执行外部程序。 但是open_port的性能对整个系统来讲非常的重要,我就带领大家看看open_port影响性能的因素。首先看下open_port的文档:{spawn, Command}Starts an external program. Command is the name of the

2013-06-07 13:41:12 3083

原创 Erlang版TCP服务器对抗攻击解决方案

互联网上的TCP服务器面对的环境情况比企业私有的服务器要复杂很多。常见的针对tcp服务器的攻击有以下几种:1. 伪造协议,导致服务器crash. 比如说某条命令的字段长度,协议最大规定是1024,伪造个4096的。2. 伪造大的报文,比如说一个包有1024M这么大。3. 消耗服务器资源。开大量的连接, 以龟速发送报文,比如说每分钟一个字节。4. DDOS攻击,从不同的IP发起大量的

2013-06-07 13:36:40 1947 1

原创 gen_tcp连接半关闭问题

很久之前我发在javaeye论坛上,预防丢了抄过来:原文:http://erlang.group.iteye.com/group/wiki/1422-gen_tcp-half-closed当tcp对端调用shutdown(RD/WR) 时候, 宿主进程默认将收到{tcp_closed, Socket}消息, 如果这个行为不是你想要的,那么请看:shutdown(Socket,

2013-06-07 13:36:00 1623

原创 qperf测量网络带宽和延迟

我们在做网络服务器的时候,通常会很关心网络的带宽和延迟。因为我们的很多协议都是request-reponse协议,延迟决定了最大的QPS,而带宽决定了最大的负荷。 通常我们知道自己的网卡是什么型号,交换机什么型号,主机之间的物理距离是多少,理论上是知道带宽和延迟是多少的。但是现实的情况是,真正的带宽和延迟情况会有很多变数的,比如说网卡驱动,交换机跳数,丢包率,协议栈配置,光实际速度都很大的影响了数

2013-06-07 13:32:05 2330

原创 fio性能测试工具新添图形前端gfio

fio是个非常强大的IO性能测试工具,可以毫不夸张的说,如果你把所有的fio参数都搞明白了,基本上就把IO协议栈的问题搞的差不多明白了,原因在于作者Jens Axboe是linux内核IO部分的maintainer. 但是这个工具有个很大的缺点就是没有图形界面,单靠输出的数字很难看出来IO的趋势变化,所以急需一个图形前端.幸运的是Jens也认识到这个问题,2012年2月15号在google p

2013-06-07 13:30:01 2913 1

原创 gen_tcp容易误用的一点解释

前天有同学在玩erlang gen_tcp的时候碰到了点小麻烦,描述如下:比如说连接到baidu.com,发个http请求,然后马上接收数据,发现接收出错,wireshark抓包发现数据都有往返发送,比较郁闷。我把问题演示下: $ erlErlang R14B03 (erts-5.8.4) 1 [64-bit] [smp:16:16] [rq:16] [async-thread

2013-06-07 13:16:35 2188

原创 非阻塞connect的一个细节

昨天听zhuzhaoyuan说的一个connect细节. 通常我们connect的时候都是非阻塞的, 在connect调用后把句柄挂到poll去, 等poll通知可写的时候, 我们就认为connect成功了. 但是在linux平台下实际上不一定成功, 具体的要用socket get_opt来检查下出错码来决定.以下是从man 2 connnect摘抄的:EINPROGRESSThe

2013-06-07 13:13:26 1413

转载 gen_tcp:send的深度解刨和使用指南(初稿)

在大家的印象中, gen_tcp:send是个很朴素的函数, 一调用数据就喀嚓喀嚓到了对端. 这是个很大的误解, Erlang的otp文档写的很不清楚. 而且这个功能对于大部分的网络程序是至关重要的, 它的使用对否极大了影响了应用的性能. 我听到很多同学在抱怨erlang的性能低或者出了很奇怪的问题, 很多是由于对系统的不了解, 误用的. 我下面就来解刨下, 文章很长, 而且需要读者熟悉erlan

2013-06-07 13:12:17 2881

原创 gen_tcp发送进程被挂起起因分析及对策

最近有同学在gmail上问关于gen_tcp发送进程被挂起的问题,问题描述的非常好,见底下:第一个问题是关于port_command和gen_tcp:send的。从项目上线至今,我在tcp发送的地方遇到过两次问题,都跟port_command有关系。起初程序的性能不好,我从各方面尝试分析和优化,还有部分是靠猜测,当初把全服广播消息的地方,换成了port_command,当时参考了hot

2013-06-07 13:10:49 2390

原创 gen_tcp调用进程收到{empty_out_q, Port}消息奇怪行为分析

今天有同学在gmail里面问了一个Erlang的问题,问题描述的非常好, 如下:问题的背景是:1、我开发了一个服务端程序,接收客户端的连接。同一时刻会有多个客户端来连接,连接后,接收客户端请求后,再发送响应消息,然后客户端主动断连。2、服务端监听的socket属性设置如下:[binary, {packet, raw},{ip, IPAddr}, {backlog, 1000

2013-06-07 13:03:20 1860

原创 未公开的gen_tcp:unrecv以及接收缓冲区行为分析

gen_tcp:unrecv是个未公开的函数,作用是往tcp的接收缓冲区里面填入指定的数据。别看这小小的函数,用起来很舒服的。我们先看下它的代码实现,Erlang代码部分:%%gen_tcp.erl:L299unrecv(S, Data) when is_port(S) -> case inet_db:lookup_socket(S) of {ok, Mod

2013-06-07 13:02:25 1791

原创 gen_tcp接收缓冲区易混淆概念纠正

Erlang的每个TCP网络链接是由相应的gen_tcp对象来表示的,说白了就是个port, 实现Erlang网络相关的逻辑,其实现代码位于erts/emulator/drivers/common/inet_drv.c参照inet:setopts文档,它有三个buffer相关的选项,非常让人费解:{buffer, Size}Determines the size of the

2013-06-07 13:01:33 1500

原创 gen_tcp如何限制封包大小

我们在做tcp服务器的时候,通常会从安全考虑,限制封包的大小,预防被无端攻击或者避免极端的请求对业务造成损害。我们的tcp服务器通常是erlang做的,那么就涉及到gen_tcp如何限制封包的大小. gen_tcp对封包的获取有2种方式:1. {active, false} 封包透过gen_tcp:recv(Socket, Length) -> {ok, Packet} | {erro

2013-06-07 13:00:06 2341

原创 gen_tcp发送缓冲区以及水位线问题分析

前段时间有同学在线上问了个问题:服务器端我是这样设的:gen_tcp:listen(8000, [{active, false}, {recbuf,1}, {buffer,1}]).客户端是这样设的:gen_tcp:connect(“localhost”, 8000, [{active, false}, {high_watermark,2}, {low_watermark,1}, {s

2013-06-07 12:56:33 3324

原创 erlang集群IP段限制

Erlang集群二个节点之间的通讯是通过一个tcp长连接进行的,而且是全联通的,一旦cookie论证通过了,任何一个节点就获得全集群的访问权,可以参考Erlang分布的核心技术浅析。erlang的这个授权模式特定搞的这么简单,但是在实际使用中还是有安全性的问题。我们退而求其次,来个IP网段限制,这个功能Erlang是有的只是没有文档化。我们来看下代码:inet_tcp_dist.e

2013-06-07 12:53:12 1977

原创 如何存储port的数据而不是用ets表?

我们通常在使用port的时候, 需要把他同其他的上下文关联起来, 以便在port给我们发生数据的时候, 我们能根据绑定的上下文, 知道如何处理数据.有2种办法:1. 用ets来保存{Port, Ctx},这个比较慢, 每次都要查表.2. 用Port本身的空间来保存Ctx. erlang:port_set_data 和erlang:port_get_data就是干这类事情的, 一步到位,

2013-06-07 12:51:17 1462

原创 ERLANG unicode8

不少人和我一样在Erlang实践过程中都会遇到中文的问题,其中有中文显示的问题有正则表达式匹配的问题等等;今天请教立涛之后梳理了一下,整理于此.概念Unicode UTF-8    《深入理解计算机系统》里面提到过"信息=数据位+上下文",同样的数据在不同的上下文环境有不同的解读方式; 同样的二进制数据按照不同的编码规范去解析得出的结果也不尽相同,如果使用错误的编码方式去解读数据就会出现所

2013-06-03 21:56:40 1910

原创 erlang细节

1.系统定义并使用过的原子after and andalso band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse query receive rem try when xor2.各种数据类型的排序number 3.函数的最后一个表达式返回的值即为函数返回的值Instead,

2013-06-03 12:00:34 2882

原创 Erlang Queue

Queue 是Erlang的队列,它的内部实现充分考虑到了效率,值得学习.估计"如何用链表高效实现Queue"这个也会在面试题目中频繁出现吧.queue模块中除了len/1,join/2, split/2,filter/2 and member/2复杂度是O(n)之外所有的操作的复杂度都在O(1).怎么做到的呢?巧妙的实现   queue使用两个list来实现,这两个L

2013-06-02 17:17:27 2505

原创 ERLANG日期与时间

在开发过程中,有两个概念是和地区区域相关的:字符编码和时间;编码和时间的规范演变过程中有文化的冲突有历史的遗留,是软件开发中充满人文气息的一角;关于字符编码我之前整理过一篇文章, [Erlang 0024]Erlang二进制数据处理 这部分知识很有意思,特别是格列佛游记所引出的大端小端概念,妙趣横生;平时笔记中也零零散散记录了一些和时间处理相关的内容,今天按图索骥把相关的资料整理汇集于此.

2013-06-02 16:15:43 1928

原创 NoSql

清明假期翻以前的笔记发现有一些NoSQL相关的内容,比较零散,是之前读《Big Data Glossary》的笔记.简单整理了一下,记录于此.Horizontal or Vertical Scaling数据库扩展的方向有两个:垂直扩展-换更牛的机器水平扩展-增加同样的机器选择水平扩展必然遇到的一个问题就是,如何决定数据分布在哪台机器上? 也就是分片策略分片Shardin

2013-06-02 14:05:32 3571

原创 在erlang shell中使用ETS

在Erlang Shell中调试的时候经常会遇到的一个问题就是在Shell中遇到异常会导致ETS表丢失,需要反复去创建ETS表,调试比较麻烦.这是由于Erlang Shell在遇到异常之后会重建,ETS表依赖于创建它的进程,如果创建它的进程崩溃了ETS表也就销毁了(不是绝对的,后面可以看到);看下官方文档的描述:  Note that there is no automatic garba

2013-06-02 13:54:14 1845

原创 fun函数的强大用法-尾递归

List Comprehensions的更是强大,官方文档:http://www.erlang.org/doc/programming_examples/list_comprehensions.html另外列表解析可以在Erlang Shell中方便的实现for循环和if 但是在Erlang Shell里面怎么写尾递归呢?1>

2013-06-02 12:20:34 5268

原创 Erlang经验

学习Erlang有点滴收获就会记录到Evernote,今天又整理出来了一部分,分享一下.    下面的内容有的来自项目实践,有的来自Stackoverflow,erlangqa;erlangqa上的几个问题都是litaocheng给出的答案,厉害!简单的开始从简单的开始,在Erlang Shell里面写demo的时候要注意一下运算顺序:6> [1,2,3,2

2013-06-01 19:24:12 2018

原创 非常好的国外技术网站

1.架构http://highscalability.com/2.建模http://www.wolframalpha.com/3. 命令http://www.commandlinefu.com/commands/browse4.学术搜索http://scholar.google.com/#5.RAMBITMQhttp://www.lshift.net/blog/category/t

2013-06-01 18:46:14 7771

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除