存档

‘缓存集群’ 分类的存档

Ejabber 压力测试

2015年10月6日 没有评论

1.测试环境

– 服务端:普通机*(I3 2核心4线程)/mem:16GB

– 客户端:普通机*(I3 2核心4线程)/mem:48GB(4台)

– 系统:sys:Centos  6  Erlang:OTP 18   Ejabberd 15

– 网络:内网千兆互联

分布式测试

distributed-test

 

2.Ejabberd 性能调优

调整ulimit限制

编辑/etc/security/limits.conf,加上:

# 方便看core
root hard core unlimited
root soft core unlimited

root hard fsize unlimited
root soft fsize unlimited

# socket连接数限制
root hard nofile 655350
root soft nofile 655350

编译优化

官方不建议开启Hipe,速度提升的同时可能带来一些问题,如fprof不能正常使用,这里面选择部分hipe(xml),参考Speed Up Ejabberd

cd ejabberd/deps/p1_xml/src
erlc +native xml.erl
cp xml.beam ejabberd ebin

启动参数调整(安装路径默认)

编辑/etc/ejabberd/ejabberdctl.cfg

  • ERL_MAX_PORTS (默认最大32w在线)

每个到客户端(s2c)和服务器(s2s)的连接消耗一个port, ERL_MAX_PORTS定义了Ejabberd可以支持的并发连接数,默认值为32000,大并发连接场景下的应用需要增大该参数的值。这里改成3200000。

ERL_MAX_PORTS=3200000
  • ERL_PROCESSES (默认最大12w在线)

Erlang消耗很多轻量级进程, 如果Ejabberd比较繁忙, 可能会达到进程数上限, 这种情况会导致高。 当消息延迟过高时, 需要判断是否是由于该参数引起的。默认值为250000,这里改成25000000。

ERL_PROCESSES=25000000
  • Mnesia表过载

大并发时mnesia警告** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},在disc_copy类型的表时,有两个参数影响出现Mnesia is overloaded: {dump_log, write_threshold}错误,默认参数是dump_log_write_threshold 50000 -mnesia dc_dump_limit 40。

dc_dump_limit:磁盘备份表从内存中被抛弃的时间间隔
dump_log_time_threshold:在新垃圾回收之前的最大的写入数

MNESIA_OPTIONS="-mnesia dump_log_write_threshold 50000 -mnesia dc_dump_limit 40"
  • ETS表个数限制问题

ets表使用的数目超过系统的限制提示:”Too many db tables”

ERL_MAX_ETS_TABLES=140000
  • 快速垃圾回收(影响不确定,不是很建议加)

按1k/sec 频率登录时,当在线到达10w时会触发gc(Major collection),在gc执行期间开销比较大(通过VTune),会引起中断,造成cpu跑满,系统响应下降。fullsweep_after控制深扫描的频率,这个参数确定多少次gc后执行一次深度gc,这里调成0,可以较快内存回收。

ERL_FULLSWEEP_AFTER=0
export ERL_FULLSWEEP_AFTER
  • Erlang 虚拟机参数(影响不确定,不是很建议加)

参考:http://www.cnblogs.com/lulu/p/4132278.html

修改/etc/ejabberd/ejabberdctl.cfg中的ERL_OPTIONS

ERL_OPTIONS="-sbt db -sbwt none -swt low"

+sbt db 绑定调度器与CPU的亲缘性
+sbwt none 关闭beam 调度器 spinlock,降低CPU
+swt low 提高调度器唤醒灵敏度,避免长时间运行睡死问题
+P 2000000 进程数限制(默认即可)
+K true 启用epoll (默认使用)
+smp auto 在多核上开启多个调度器 (默认使用)

 

ejabberd配制调整

  • 调整日志等级

修改/etc/ejabberd/ejabberd.yml

loglevel: 3
  • 堆大小监视调整

在线到达10w后cpu消耗大问题。

watchdog_large_heap: 10000000

 

内核参数调整

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.ip_local_port_range = 1025 65000
fs.file-max = 65535000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_mtu_probing = 1

3.压测场景

  •  2k/s 登陆、认证、操作。
  • 运行2分钟后20w在线

4.结果

  • 4台tsung集群未跑满,瓶颈在服务器。
  • 服务器:未触发gc时CPU剩余30%左右。
  • 服务器:内存最高7g,登陆完后稳定3g。
  • 服务器:流量上平均收2.5m/sec,发3.5m/sec。
  • 在gc(Major collection)启动时会比较严重影响服务器响应速度,在不开启快速回收(fullsweep_after)在线达不到要求(20w),下图可以明显看到。

ejabberd_gc

 

参考资料

1.Erlang C1500K长连接推送服务-性能

http://www.cnblogs.com/lulu/p/4132278.html

2.Erlang进程堆垃圾回收机制

http://blog.csdn.net/mycwq/article/details/26613275

3.Erlang垃圾回收机制

http://www.cnblogs.com/me-sa/archive/2011/11/13/erlang0014.html

4.erlang 虚机CPU 占用高排查

http://www.cnblogs.com/lulu/p/3978378.html

分类: 缓存集群 标签:

MCRouter笔记(三) 路由句柄

2015年8月12日 没有评论

来自:https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles

 

AllAsyncRoute

立即发送请求到所有子路由句柄,不等待子路由句柄返回,直接返回NullRoute给请求方。

属性:

  • children: 子路由句柄。

AllFastestRoute

立即发送请求到所有子路由句柄,把第一个无错误的响应返回给请求,其它的返回默认忽略。

属性:

  • children: 子路由句柄。

AllInitialRoute

立即发送请求到所有子路由句柄,等待子路由句柄列表中第一个句柄的返回,并把这个给请求方,其它的返回默认忽略。

属性:

  • children: 子路由句柄。

AllMajorityRoute

Immediately sends the same request to all child route handles. Waits for replies until a non-error result appears (half + 1) times (or all replies if that never happens), and then returns the latest reply that it sees (the effect is that typically the reply with the most common result is returned).

  • children: 子路由句柄。

AllSyncRoute

立即发送请求到所有子路由句柄,返回所有回复中最差的。

属性:

  • children: 子路由句柄。

DevNullRoute

Same as NullRoute, but with mcrouter stats reporting. See Stats list.

ErrorRoute

Immediately returns the error reply for each request. You can specify the error value to return: "ErrorRoute|MyErrorValueHere"

FailoverRoute

首先发送请求到子路由句柄列表中的第一个路由句柄,如果没有返回错误就立即返回请求,否则继续发到列表中的下一个路由句柄。如果所有都返回错误则返回最后一个错误的回复。注意:没命中不算错误。

  • children: 子路由句柄。
  • failover_errors:对象或数组,可选项,默认所有错误。

failover_errors可指定错误类型,如:

{
 "gets": [ "connect_timeout", "timeout", "connect_error", "tko" ],
 "updates": [], // empty array: will not failover.
 // "deletes" is missing, default behavior (all errors) will be assumed.
}
[ "connect_timeout", "timeout", "connect_error", "tko" ]

FailoverWithExptimeRoute

 

HashRoute

根据哈希路由。

  • children: 子路由句柄。
  • salt:key的前缀。
  • hash_func:哈希函数Ch3, Crc32 or WeightedCh3,默认为Ch3。
  • weights:hash_func为WeightedCh3时有效。

HostIdRoute

根据客户端ID路由。

  • children: 子路由句柄。

LatestRoute

随机连接,如果返回错误再次随机,最大随机次数为failover_count。

  • children: 子路由句柄。
  • failover_count:默认5次
  • failover_errors:错误类型。
分类: 缓存集群 标签:

MCRouter笔记(二) 常见应用

2015年8月7日 没有评论
  • 分片池

当数据量太大,单个memcached不够放时,通常会把数据拆分到多台机器上,这就是所谓的水平分割。mcrouter提供了一个行之有效的consistent hashing算法(furc_hash),算法允许给多个memcached实例分配哈希值。Hostname hashing再根据分配的哈希值为客户端选择一个独一无二的副本,在特定的应用中有很多其他的有用的散列方法。

分片池

分片池

 

配制说明:请求按hash key路由到池A中不同的memcached。

{
   "pools": {
     "A": {
       "servers": [
         // your destination memcached boxes here, e.g.:
         "127.0.0.1:12345",
         "[::1]:12346"
       ]
     }
   },
   "route": "PoolRoute|A"
 }

 

阅读全文…

分类: 缓存集群 标签:

MCRouter笔记(一) – 安装

2015年8月6日 2 条评论
#!/bin/bash

temp_path=$(dirname "$0")
cd $temp_path
real_path=$(pwd)
echo  "本脚本文件所在目录路径是: $real_path "
cd $real_path

yum -y install unzip bzip2-devel libtool libevent-devel libcap-devel openssl-devel
yum -y install bison flex snappy-devel numactl-devel cyrus-sasl-devel

mkdir -p /data/source/mcrouter/src

#GCC4.9 folly用到了诸如 chrono 之类的C++11库,必须使用GCC 4.8以上版本,才能够完整支持这些用到的C++11特性和标准库。
cd /data/source/mcrouter/src
wget https://gmplib.org/download/gmp/gmp-5.1.3.tar.bz2
tar jxf gmp-5.1.3.tar.bz2 && cd gmp-5.1.3/
./configure && make && make install

cd /data/source/mcrouter/src
wget http://www.mpfr.org/mpfr-current/mpfr-3.1.2.tar.bz2
tar jxf mpfr-3.1.2.tar.bz2 ;cd mpfr-3.1.2/
./configure && make && make install

cd /data/source/mcrouter/src
wget http://www.multiprecision.org/mpc/download/mpc-1.0.1.tar.gz
tar xzf mpc-1.0.1.tar.gz ;cd mpc-1.0.1
./configure && make && make install

cd /data/source/mcrouter/src
wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.1/gcc-4.9.1.tar.bz2
tar jxf gcc-4.9.1.tar.bz2 ;cd gcc-4.9.1
ldconfig
./configure -enable-threads=posix -disable-checking -disable-multilib -enable-languages=c,c++ -with-gmp -with-mpfr -with-mpc
make && make install
ldconfig


#CMAKE
cd /data/source/mcrouter/src
wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2.tar.gz
tar xvf cmake-2.8.12.2.tar.gz && cd cmake-2.8.12.2
./configure && make && make install


#AutoConf
cd /data/source/mcrouter/src
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xvf autoconf-2.69.tar.gz && cd autoconf-2.69
./configure && make && make install


#SCONS
cd /data/source/mcrouter/src
rpm -Uvh http://sourceforge.net/projects/scons/files/scons/2.3.3/scons-2.3.3-1.noarch.rpm


#Ragel
cd /data/source/mcrouter/src
wget http://www.colm.net/files/ragel/ragel-6.9.tar.gz
tar -zxvf ragel-6.9.tar.gz
cd ragel-6.9
./configure && make && make install


#Python27 for Boost
yum -y install centos-release-SCL
yum -y install python27
scl enable python27 "easy_install pip"


#Boost
scl enable python27 bash
python --version
cd /data/source/mcrouter/src
wget http://downloads.sourceforge.net/boost/boost_1_56_0.tar.bz2
tar jxf boost_1_56_0.tar.bz2 && cd boost_1_56_0
./bootstrap.sh --prefix=/usr && ./b2 stage threading=multi link=shared
./b2 install threading=multi link=shared
ldconfig


#Gflags
cd /data/source/mcrouter/src
wget https://github.com/schuhschuh/gflags/archive/v2.1.1.tar.gz
tar xzvf gflags-v2.1.1.tar.gz
mkdir -p gflags-2.1.1/build/ && cd gflags-2.1.1/build/
cmake .. -DBUILD_SHARED_LIBS:BOOL=ON -DGFLAGS_NAMESPACE:STRING=google && make && make install


#GLOG
cd /data/source/mcrouter/src
wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
tar xvf glog-0.3.3.tar.gz && cd glog-0.3.3
./configure && make && make install


#double-conversion for Folly
cd /data/source/mcrouter/src
git clone https://code.google.com/p/double-conversion/
cd double-conversion-master && scons install
ln -sf src double-conversion
ldconfig


#Folly
cd /data/source/mcrouter/src
git clone https://github.com/genx7up/folly.git
cd folly/folly/test
wget https://googletest.googlecode.com/files/gtest-1.6.0.zip
unzip gtest-1.6.0.zip
cd ../
autoreconf --install
export CPPFLAGS="-I/data/source/mcrouter/double-conversion"
./configure && make && make install


#McRouter
cd /data/source/mcrouter/src
git clone https://github.com/facebook/mcrouter.git
cd mcrouter/mcrouter
export CPPFLAGS="-I/data/source/mcrouter/double-conversion"
autoreconf --install
./configure && make && make install
mcrouter --help

 

分类: 缓存集群 标签: