[Erlang]通用的erlang优化设置

设置是我在多个项目中通用的,不过根据应用场景的不同,还会有其它细调,就不在这一一说明了。  - Sunface

 一、 erl启动时参数:

+K true

开启epoll调度,在linux中开启epoll,会大大增加调度的效率

+A 100

异步线程池,为某些port调用服务

+P 1024000

最大进程数

+Q 65535

最大port数

+sbt db

绑定调度器,绑定后调度器的任务队列不会在各个CPU线程之间跃迁,结合sub使用,可以让CPU负载均衡的同时也避免了大量的跃迁发生。

注意:一个linux系统中,最好只有一个evm开启此选项,若同时有多个erlang虚拟机在系统中运行,还是关闭为好

+sub true

开启CPU负载均衡,false的时候是采用的CPU密集调度策略,优先在某个CPU线程上运行任务,直到该CPU负载较高为止。

+swct eager
此选项设置为eager后,CPU将更频繁的被唤醒,可以增加CPU利用率

+spp true
开启并行port并行调度队列,当开启后会大大增加系统吞吐量,如果关闭,则会牺牲吞吐量换取更低的延迟。

+zdbbl 65536

分布式erlang的端口buffer大小,当buffer满的时候,向分布式的远程端口发送消息会阻塞

二、erlang内部进程启动参数

示例:创建一个新进程并进行注册,该进程是全局唯一的自增ID生成进程,因此无法做多进程处理,这个时候单进程的性能就是至关重要的

首先,出于性能和功能考虑,这个进程不是gen_server;其次进行了部分参数调优能

register(num_generator, spawn_opt(?MODULE, init, [],[{priority,high},{scheduler,0},{min_heap_size, 65536 * 2},{min_bin_vheap_size,65536 * 2}])).

参数讲解:

1.priority

er lang是公平调度策略,因此默认情况下每个进程得到的运行时间片是相同的:2000reductions,但是对于我们的应用场景来说,这个进程应该是优先级较高的,需要得到更多的调度,因此设置为high,还可以设置为max,但是max是系统进程的预留优先级,用high即可

2. scheduler

将该进程绑定到指定的scheduler上,防止进程的任务被scheduler分配来分配去,可以减少CPU调用,注意这个和+sbt db是不同的,+sbt db是防治调度器的任务队列在CPU线程间跃迁,scheduler是为了防止进程在时间片切换过程中被分配给其它的调度器

3.min_heap_size

进程初始堆大小,用内存换CPU的典型做法,增大初始大小,可以显著降低GC次数和内存再分配次数

4.min_bin_vheap_size

进程初始二进制堆大小,当该进程对于binary数据的处理交换很多时,可以获得和增大min_heap_size一样的效果

 三、port(socket)调优

示例:服务器监听端口,接受客户端请求。典型应用场景web服务器,需要实现高吞吐,低延迟的目标

Res = gen_tcp:listen(Port, [binary,

{reuseaddr, true},

{nodelay, true},

{delay_send,true},

{high_watermark,64 * 1024},

{send_timeout, 30000},

{send_timeout_close, true},

{keepalive, true}])

参数详解:

binary:

接收到客户端的消息后,作为binary来处理,binary在erlang中是很高效的数据结构,超过64字节,就是全局保存的,因此在很多操作下是不需要复制的,仅仅复制binary的指针即可,详细请搜索refc binary,注意:binary大量使用需要有丰富的经验,不然可能会内存泄漏

reuseaddr:

允许系统复用port,对于高吞吐的系统,这个参数很重要,请搜索:linux port 复用

nodelay:

开启linux中的TCP_NODELAY参数,请搜索:TCP_NODELAY 40毫秒延迟

delay_send:

默认的erlang port消息发送,是直接发送,若失败则排队处理,然后由调度器进行队列poll操作,如果设置为true,那么就不尝试直接发送,而且扔进队列,等待poll,开启选项会增加一点点消息延迟,换来吞吐量的大量提升

high_watermark:

port的发送缓存,缓存满了后,下次发送会直接阻塞,直到缓存低于某个阈值low_watermark。如果是密集网络IO系统,请增大该buffer,避免发送阻塞

send_timeout:

在high_watermark中提到了发送阻塞,如果阻塞超过这个时间,那么就会超时,发送直接返回,停止发送

send_timeout_close:

如果发生了send_timeout同时设置了send_timeout_close选项,那么超时后,会直接关闭socket.如果发送进程不是很重要,例如web用户进程,强烈建议开启这个选项,当发送30秒超时的时候,就说明该用户出现了很大的麻烦,断开连接是最理想的做法,否则可能出现很多奇怪的bug.

keepalive:

遵循HTTP/1.1协议的keepalive规定,这个根据业务需求选择是否开启,如果同一个客户端会连续发起http请求,那么建议设置为true,避免多次TCP握手

示例:服务器发起大量的http请求,在优化了参数后,同样的吞吐量所耗费的时间是未优化前的1/3 - 1/2(经过严苛的测试得出的数据)

inets:start(),

  httpc:set_options([{max_keep_alive_length,500},{max_sessions,100},{nodelay,true},{reuseaddr,true}]),

参数详解:

max_keep_alive_length:

在同一条http连接上允许发送的最大包数,默认为5,超过5个包,就会重连

max_sessions:

跟目标服务器之间最大的并行http连接数目,大大的增加了数据上行吞吐量

nodelay_true:

见上文

reuseaddr:

见上文

先写这么多,以后会陆续更新,如果这篇文章对你有帮助,请留言支持,一个字一个字的敲也是很辛苦的 ;)

时间: 2025-01-02 15:23:01

[Erlang]通用的erlang优化设置的相关文章

Erlang基础 -- 介绍 -- Erlang特点

前言 Erlang是具有多重范型的编程语言,具有很多特点,主要的特点有以下几个: 函数式 并发性 分布式 健壮性 软实时 热更新 递增式代码加载 动态类型 解释型 函数式 Erlang是函数式编程语言,函数式是一种编程模型,将计算机中的运算看做是数学中的函数计算,可以避免状态以及变量的概念. 对象是面向对象的第一型,函数式编程语言也是一样,函数是函数式编程的第一型.函数是Erlang编程语言的基本单位,在Erlang里,函数是第一型,函数几乎会被用作一切,包括最简单的计算.所有的概念都是由函数表

Archive for the ‘Erlang’ Category 《Erlang编程指南》读后感

http://timyang.net/category/erlang/ 在云时代,我们需要有更好的能利用多核功能及分布式能力的编程语言,Erlang在这方面具有天生的优势,因此我们始终对它保持强烈关注. 按:此为客座文章,投稿人为新浪微博基础研发工程师赵鹏城(http://weibo.com/iamzpc),以下为原文.在对一个分布式KV存储系统的研究过程中,我有幸遇到了Erlang语言.因此,我研究工作的第一目标就是快速入门Erlang语言并在实际研究过程中进一步深入理解Erlang的精髓.在

MyEclipse 10各种优化设置

1.通用优化设置:字体,UTF-8编码格式设置: http://jingyan.baidu.com/article/b907e627d2c5da46e7891cef.html 2.字母促发代码提示方法: http://jingyan.baidu.com/article/95c9d20df6c56aec4e7561ad.html 3.spring 的XML代码提示: http://blog.csdn.net/sundacheng1989/article/details/8333304

mysql数据库的安装以及常见优化设置

原文:mysql数据库的安装以及常见优化设置 本文根据优才网课程整理,面向web开发者,内容以实用为主,专业DBA可以绕行. 如果你在大公司,可能有专门的DBA来做这些事情,如果你在一个小公司当架构师或者技术总监,或者你自己创业,那DBA的活你也得干了.咱们来讲一下基本的mysql安装和优化. 一: MYSQL安装和基本配置 在linux上安装,可以用包管理工具来安装,比较简单:RedHat 系列:yum -y install mysql mysql-server Debian系列:sudo a

基于linux的web服务器的iptables防火墙安全优化设置

安全规划:开启 80  22 端口并 打开回路(回环地址 127.0.0.1) #iptables –P INPUT ACCEPT #iptables –P OUTPUT ACCEPT #iptables –P FORWARD ACCEPT 以上几步操作是为了在清除所有规则之前,通过所有请求,如果远程操作的话,防止远程链接断开. 接下来清除服务器内置规则和用户自定义规则: #iptables –F #iptables -X 打开ssh端口,用于远程链接用: #iptables –A INPUT

MySQL MyISAM优化设置点滴

先说一点问题: Mysql中的InnoDB和MyISAM是在使用MySQL中最常用的两个表类型,各有优缺点.两种类型最主要的差别就是 InnoDB 支持事务处理与外键和行级锁.而MyISAM不支持.所以Myisam往往就容易被人认为只适合在小项目中使用.但是从数据库需求角度讲,要求99.9%的稳定性,方便的扩展性和高可用性来说的话,那MyISAM绝对应该是首选.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快, 只是不提供事务支持.大部分项目是读多写少的项目,而Myisam的读

T端mysql优化设置

下面是一个我自己用的设置MYSQL的安全的魔兽世界私服的单机设置办法.这个是针对2-4G内存来设置的.提升MYSQL的吞吐量.实现MYSQL的稳定,让多人在游戏里面玩的时候不至于由于MYSQL而导致很卡[client] port=3306 [mysqld] port=3306 old-passwords=1 basedir="D:\MGCORE-4.1.0-V1.2.1-14007\Web_Mysql\mysql5/" datadir="D:\MGCORE-4.1.0-V1.

ASP.NET在IIS的启动优化设置

ASP.NET在IIS的启动优化设置 约定: IIS=Internet Information Services Manager 概要 因为ASP.NET 程序在第一次启动的时候需要等待太长时间,至少是第二次访问的3倍以上时间,这是由于程序是按需启动的,而且程序会在空闲一段时间后自动关闭. 所以特意做了这个文档来告诉大家怎么能让ASP.NET 程序在第一次启动(或者重启)的时候表现的更好,至少速度上接近第二次访问. IIS 8 如果系统是Windows Server 2012 或以上,那么系统自

[Erlang]如何在Erlang中将对list进行json编码?

Json编码,在python里就是一句话: json.dumps(user_data) 但是Erlang没有自带的Json模块,只能自己造轮子: 先下载mochijson2: https://github.com/mochi/mochiweb/blob/master/src/mochijson2.erl 用erlc编译 然后,上代码: get_json_data() -> UserData = [{"product_name", "Programming Erlang&