免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wlmqgzm
打印 上一主题 下一主题

[C++] 读性能超过Memcached 65%, 单核也超过redis, 支持日志支持掉电保护,欢迎试用 [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
111 [报告]
发表于 2017-02-13 17:28 |只看该作者
下面是我设计的一个高性能spin_lock, 可以挑战目前所有linux下的spin_lock版本。

class Spin_lock
{
public:
Spin_lock( void );
void lock( void );
bool try_lock( void );
void unlock( void );

Spin_lock( const Spin_lock& ) = delete;
Spin_lock& operator = ( const Spin_lock& ) = delete;

private:
std::atomic<bool> d_atomic_bool;
};


Spin_lock::Spin_lock()
{
d_atomic_bool.store( false, std::memory_order_relaxed );
return;
}

void Spin_lock::lock( void )
{
while( d_atomic_bool.exchange( true, std::memory_order_acquire ) ) {
while( 1 ) {
_mm_pause(); // pause指令 延迟时间大约是12纳秒
if( !d_atomic_bool.load( std::memory_order_relaxed ) ) break;
std::this_thread::yield(); // 在无其他线程等待执行的情况下,延迟时间113纳秒
// 在有其他线程等待执行情况下,将切换线程
if( !d_atomic_bool.load( std::memory_order_relaxed ) ) break;
continue;
}
continue;
}
return;
}

bool Spin_lock::try_lock( void )
{
return !d_atomic_bool.exchange( true, std::memory_order_acquire );
}

void Spin_lock::unlock( void )
{
d_atomic_bool.store( false, std::memory_order_release ); // 设置为false
return;
}

我们的核心lock()代码中关键的第1行
while( d_atomic_bool.exchange( true, std::memory_order_acquire ) )
首先是使用了更高效率的exchange, 要比CAS指令有更高的效率,是内存读写模式,每次都要独占cache,并且将其他CPU的cache设置为invalide, 如果只有这1行代码,那么 如果两个以上CPU在等待这把锁,将交替将64字节Cacheline内存反复同步, 数据冲突激烈,影响其他线程的内存操作,降低整体性能, 影响全部CPU的工作效率, 因为产生了内存争用, 产生了总线争用

因此我们提供了第2行关键检测代码:
if( !d_atomic_flag.load( std::memory_order_relaxed ) ) break
该指令主要是为了减少CAS指令循环对内存总线带来的不良影响, 这个循环只有在锁被释放后, 才会跳出循环, 但是这个指令消耗的资源极少。这组指令是 只读模式检查, 只需要锁没有被释放, 这里继续循环, 但是这组spin是没有竞争状态的, 不会对内存和cache产生任何影响, 只要锁不释放, 永远不会内存总线的争夺, 因此大大提高了整体的效率

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
112 [报告]
发表于 2017-02-13 17:31 |只看该作者
atomic的exchange/test_and_set/check_and_swap一般都需要serialization,即在执行这条指令前,CPU必须要完成前面所有对memory的访问指令(read and write)。这是非常heavy的操作,使得CPU无法对指令进行reorder,从而优化执行。
因为每一次atomic的exchange/test_and_set/check_and_swap都必须读-写 state 这个变量。这就要涉及到多个CPU之间cache coherence的问题。
当CPU1读state的时候,如果这个state没有在CPU1的cache中,就需要从memory中读入,因为CPU又需要写这个变量,所以在把这个变量读入cache的时候,如果其他CPU已经cache了这个变量,就需要invalidate它们。这样在CPU1把lock读入自己的cache中时,这块cacheline所cache的lock就是CPU1所独占的,CPU1就可以更改它的值了。如果多个CPU在竞争这个spinlock的话,每一次test_and_set都需要完成以上的操作,在系统总线上会产生大量的traffic,开销是非常大的,而且unlock的CPU还必须同其它正在竞争spinlock的CPU去竞争cacheline ownership. 随着CPU数目的增多,性能会衰减的非常快。

目前包括C++ 准标准库Boost库在内的spin_lock都存在一些缺陷导致的性能问题。很多版本要么过于简单,出现上面的问题,要么使用了usleep()/nanosleep()/sleep()等代码, 例如:linux下usleep(0)/nanosleep(0)实际测试是50微秒的延迟时间,而我们的锁占用总时长可能只有1-10个微秒。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
113 [报告]
发表于 2017-02-15 14:45 |只看该作者
本帖最后由 wlmqgzm 于 2017-02-15 14:48 编辑

今年第1个高性能数据库产品开发已经完成,昨天已经完成了健壮性测试,在任何情况下,程序都不会出现崩溃,也不会有内存泄露,可以长期使用,现在产品已经具备了正式使用的各项条件。

由于支持日志功能,所以,可以满足各中对可靠性要求比较高的场合, 并且在打开日志功能的情况下, 依旧具备非常高的性能,满足了性能和可靠性 。
日志部分是亮点, 主要是日志的写合并技术比较先进,因此,超越了各类数据库很多, 基本上是目前最快的日志系统。

产品试用下载: http://www.haisql.com/fwzc/soft/
如果产品的试用期过了30天, 请重新下载拷贝一次, 就又可以使用30天了。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
114 [报告]
发表于 2017-02-16 23:42 |只看该作者
本帖最后由 wlmqgzm 于 2017-02-16 23:47 编辑

目前软件具备的基本功能, 主要是兼容memcache的指令集, 增加了部分指令, 增加了日志功能, 支持BGSAVE, 保存数据不影响正在进行的任何操作.
计划从明天起开始做一个简单的类似redis的事务处理机制, 支持MULTI, EXEC, DISCARD这3条指令, 实现有限度的简单事务. 计划完成时间1周内.
下周主要的计划是设计主从同步机制, 准备实现与redis类似的同步主从机制. 计划完成时间1到4周
最近一段时间, 这个产品的后续完善会投入比较多的时间, 因此, 开发速度希望会比较快.

guo@guo-desktop:~$ telnet 127.0.0.1 1971
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
help
中文版Memcache Server 正在运行.
版本号:1.0.16  日期:2016-2017  乌鲁木齐云山云海信息技术有限责任公司 版权所有
输入 "help" 将显示这个帮助菜单.
输入 "help XXX" 将显示关于命令XXX的帮助菜单.
输入 "table" 将使用数据表 X(0-31), 默认使用数据表 0
输入 "set" 将设置数据(插入或者更新数据).
输入 "add" 将新增加数据.
输入 "replace" 将更新数据
输入 "get" 将读取数据
输入 "gets" 将读取数据和版本号
输入 "getg" 将读取一组或者全部数据.
输入 "getl" 将读取前面与X匹配的数据。
输入 "cas" 将检查版本号,符合的情况下设置数据
输入 "append" 将追加数据
输入 "prepend" 将在数据前面增加新数据
输入 "incr" 将原数据递增X.
输入 "decr" 将原数据递减X.
输入 "delete" 将删除数据
输入 "erase_all"将删除全部数据(立即或者延迟X秒)
输入 "erase_ahead"将提前X秒删除即将到期的数据
输入 "stat" 将显示状态信息
输入 "stat reset" 将重置当前数据表的许多计数器
输入 "stat size" 将只显示大小状态
输入 "stat group" 将显示数据组状态,可以提供组编号(0-255).
输入 "echo on" 将回显输入的命令
输入 "echo off"将不回显输入的命令(默认)
输入 "show_run_time on" 将显示执行时间.
输入 "show_run_time off"将不显示命令执行时间.(默认)
输入 "table_data_max_count" 将限制当前数据表中的总数据量为 X.
输入 "table_data_max_memory" 将限制当前数据表中的总内存用量为X字节.(不完全精确,只针对命令set/add有限制)
输入 "version" 将显示软件的版本号.
输入 "save" 将复位日志文件和数据表文件,并且把最新数据保存到硬盘上, 再删除旧日志和旧数据表文件.
输入 "quit " 将中止连接退出
END

HaiSQL Memcache 服务器软件正在运行
相关网站是:http://www.haisql.com 或者 http://www.haisql.net
版本号:1.0.16  日期:2016-2017  乌鲁木齐云山云海信息技术有限责任公司 版权所有
Memcache 服务器监听端口是:1971
Debug调试监听端口是:1972
Email电子邮件: haisql@sina.com
CPU数量为 8 个。
使用 7 个线程作为工作线程, 1 个线程作为网络层管理线程, 1个线程作为日志线程.
日志工作模式 0,不保存数据日志。
本程序支持命令行参数 --help 将显示所有的运行可选参数.
客户端在连接后也支持help命令,提供详细的命令解释. 例如: help set
只键入一个 "Ctrl_C" 本程序将会正常退出.

./haisql_memcache_linux --help
All options:
  -h [ --help ]                         帮助.
  -s [ --server_bind_ip ] arg           服务器绑定IP地址
  -p [ --server_port ] arg (=1971)      服务器监听端口号
  -i [ --debug_bind_ip ] arg            debug调试绑定IP地址
  -d [ --debug_port ] arg (=1972)       debug调试监听端口号
  -x [ --table_data_max_count ] arg (=10000000)
                                        每张数据表最大数量
  -y [ --table_data_max_memory ] arg (=16000000000)
                                        每张数据表最大内存使用量
  -c [ --connect_max_idle_seconds ] arg (=600)
                                        连接最大空闲时长
  -e [ --max_socket_count_per_ip ] arg (=100)
                                        每个远程IP地址最大连接数
  -t [ --pid_file_path ] arg (=/var/log/haisql/)
                                        pid 文件路径.
  -a [ --error_log_file_path ] arg (=/var/log/haisql/)
                                        告警log 文件路径.
  -D [ --data_file_path ] arg (=/var/gzm1/)
                                        数据文件路径.
  -f [ --pid_file_name ] arg (=haisql_memcache.pid)
                                        pid 文件名称.
  -m [ --error_log_file_name ] arg (=haisql_memcache.log)
                                        告警日志文件名称.
  -o [ --concurrent_thread ] arg (=7)   并发线程数量. 默认CPU数
  -r [ --load_all_before_start ] arg (=1)
                                        是否启动前加载数据
  -v [ --save_all_before_exit ] arg (=1)
                                        是否退出前保存数据
  -w [ --data_log_work_mode ] arg (=3)  数据日志工作模式
                                        0=不保存数据日志
                                        1=保存数据日志但不主动刷新
                                        2=保存数据日志每秒刷新一次
                                        3=保存数据日志空闲时刷新
                                        4=保存数据日志等待写入系统命令才返回, 空闲时刷新
                                        5=保存数据日志等待写入硬盘命令才返回

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
115 [报告]
发表于 2017-02-17 00:09 |只看该作者
网络层提供远程数据追踪调试功能, 可以远程追踪到收发的每一个数据包和时间(精确到微秒), 以及各类重要事件, 主要是用于信令跟踪和厂家内部测试使用.

telnet 127.0.0.1 1972
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Debug网络层调试服务。
版本号:1.0.16  日期:2016-2017  乌鲁木齐云山云海信息技术有限责任公司 版权所有
输入 "help" 将显示这个帮助菜单.
输入 "status" 将显示所有的网络层计数器.
输入 "debug status" 显示debug调试状态
输入 "debug socket 123 " 将debug追踪套接字123的所有收发数据包
输入 "debug ip 192.168.1.3" 将debug追踪远程IP地址等于192.168.1.3的所有收发数据包
输入 "debug ip port 192.168.1.3 8888" 将debug追踪远端IP地址等于192.168.1.3并且远端端口号等于8888的所有收发数据包
输入 "debug max_time 60"将设置每个连接的debug追踪的持续最大时间为60秒。超时将自动取消追踪
输入 "undebug" 将取消全部连接上的debug数据追踪.
输入 "undebug socket 123 " 将取消套接字123上的debug数据追踪.
输入 "undebug ip 192.168.1.3" 将取消远端IP地址等于192.168.1.3的debug数据追踪
输入 "undebug ip port 192.168.1.3 8888" 将取消远端IP地址等于192.168.1.3并且远端端口号等于8888的debug数据追踪
输入 "message status" 显示消息输出状态
输入 "message screen on" 允许网络层消息在当前屏幕上输出(默认)
输入 "message screen off" 禁止网络层消息在当前屏幕上输出
输入 "message file on" 网络层消息允许输出到文件中
输入 "message file off" 禁止网络层消息输出到文件中
输入 "message manage on" 将在当前连接上显示网络层消息
输入 "message manage off"禁止在当前连接上显示网络层消息
输入 "message level 1" 将只有错误消息输出.
输入 "message level 2" 将只有错误和警告信息输出.
输入 "message level 3" 将错误,警告和少量日志信息输出.(注意:会极大降低性能)
输入 "message level 4" 将错误,警告和一些日志信息输出.(注意:会极大降低性能)
输入 "message level 5" 将错误,警告和全部日志信息输出.(注意:会极大降低性能)
输入 "quit" 断开当前连接,退出.
>

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
116 [报告]
发表于 2017-02-18 19:13 |只看该作者
已经完成了简单的事务处理模块,是按照 redis 的思路和案例做的,实现了Redis的三个指令:multi , exec, discard

telnet 127.0.0.1 1971Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
help
中文版 HaiSQL Memcache Server 正在运行.
版本号:1.0.18  日期:2016-2017  乌鲁木齐云山云海信息技术有限责任公司 版权所有
输入 "help" 将显示这个帮助菜单.
输入 "help XXX" 将显示关于命令XXX的帮助菜单.
输入 "table" 将使用数据表 X(0-31), 默认使用数据表 0
输入 "set" 将设置数据(插入或者更新数据).
输入 "add" 将新增加数据.
输入 "replace" 将更新数据
输入 "get" 将读取数据
输入 "gets" 将读取数据和版本号
输入 "getg" 将读取一组或者全部数据.
输入 "getl" 将读取前面与X匹配的数据。
输入 "cas" 将检查版本号,符合的情况下设置数据
输入 "append" 将追加数据
输入 "prepend" 将在数据前面增加新数据
输入 "incr" 将原数据递增X.
输入 "decr" 将原数据递减X.
输入 "delete" 将删除数据
输入 "erase_all"将删除全部数据(立即或者延迟X秒)
输入 "erase_ahead"将提前X秒删除即将到期的数据
输入 "stat" 将显示状态信息
输入 "stat reset" 将重置当前数据表的许多计数器
输入 "stat size" 将只显示大小状态
输入 "stat group" 将显示数据组状态,可以提供组编号(0-255).
输入 "echo on" 将回显输入的命令
输入 "echo off"将不回显输入的命令(默认)
输入 "show_run_time on" 将显示执行时间.
输入 "show_run_time off"将不显示命令执行时间.(默认)
输入 "table_data_max_count" 将限制当前数据表中的总数据量为 X.
输入 "table_data_max_memory" 将限制当前数据表中的总内存用量为X字节.(不完全精确,只针对命令set/add有限制)
输入 "version" 将显示软件的版本号.
输入 "save" 将复位日志文件和数据表文件,并且把最新数据保存到硬盘上, 成功后再删除旧日志和旧数据表文件.
输入 "multi" 将缓冲此命令后的所有正确格式命令,直到命令 discard/exec 输入为止.
输入 "exec" 将加锁执行已经缓存的多条指令,并且依次返回执行结果.
输入 "discard" 将丢弃缓存的从最近的'multi'命令之后的多条指令.
输入 "quit " 将中止连接退出
END
help multi
multi\r\n
multi:  缓存指令将开始, 此指令之后的所有正确格式命令都将被缓存, 直到命令 discard/exec 输入为止.
END
help exec
exec\r\n
exec: 加锁执行已经缓存的多条指令,并且依次返回执行结果.
END
help discard
discard\r\n
discard: 丢弃缓存的从最近的'multi'命令之后的多条指令.
END

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
117 [报告]
发表于 2017-02-18 19:44 |只看该作者
计划下一步是制作 主从数据同步机制, 预计时间大约是1周-4周时间,主要的同步思路和指令集, 将参考redis的实现。
大家如果有什么好的思路或者办法,可以谈一谈, 或者给出建议, 谢谢。
这个同步机制完成后,基本上这个内存KV数据库的主要功能点就算开发完毕了。

在上个阶段的技术开发工作中,积累了很多经验, 也得到了很多朋友的帮助,正是在很多论坛朋友的指导和帮助下,这个产品才能够走到今天,谢谢大家。

下一个阶段将开发新的数据库产品,主要的技术架构上将与MYSQL相比有很多变化,这个是长期开发,
初步的思路是:
1)一个是计划大量使用 时间锁 机制, 就是谷歌的那个 时间作为数据层 先后顺序的判断, 实现的一个活锁。另外,大量使用时间锁机制, 带来的额外的福利就是支持 类似Oracle 的闪回功能,可以在一瞬间将数据库恢复到24小时内的某个时间点。
2)大量全新设计的读写锁, 或者说是共享/独享锁,目前我们的版本,与std/boost库的版本,主要的变化就是一个是性能上有很大的提高,
支持多次可重入,除了支持普通的可重入之外,还支持写锁/读锁的可重入, 就是占有了写锁的时候,同一线程可以继续持有读锁,不会有冲突, 这些都是C++标准库欠缺的。这个功能点简化了很多代码。
写优先/读优先的读写锁,标准锁,可重入锁。。。。。这些部分已经完成,并且在上个版本中得到了很多应用。
3)计划支持事务处理, 事务处理方面将设计多种可变更的模式,主要增加的模式是:命令缓存模式, 多指令并发执行模式(例如:两条修改语句同时在2个线程中并发修改,最后统一合并事务处理结果)
基于事务处理的MVCC, 这些部分都是核心的代码, 可能会作为单独的
4)支持有限度的SQL语言, 先从简单的SQL语言开始做, 陆续慢慢增加,这个版本的初期用户接口结构, 考虑采用MYSQL的接口, 这样就不用单独开发用户client接口的代码。
5)支持分布式多机并发,总体架构是一个MPP架构, share_nothing无共享体系, 支持多种分布式锁。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
118 [报告]
发表于 2017-02-20 17:29 |只看该作者
本帖最后由 wlmqgzm 于 2017-02-20 17:30 编辑

下面贴出我公司内部的无锁队列

下面是一个多生产者单消费者的无锁队列,用户程序中只需要预先定义2个回调函数,然后任意时候只要push数据,消费者自动处理数据, 处理完数据后, 可以自动回调生产者call_back, 获得结果进行后续再处理。
队列中无数据,则不占用任何CPU资源。
单生产者单消费者无锁队列

template<typename T, size_t Capacity>
class  Wait_free_spsc_ios_queue: private  Wait_free_spsc_queue<T,Capacity>
{
  public:
    Wait_free_spsc_ios_queue( std::shared_ptr<boost::asio::io_service>  sp_ios_pop_in, std::function<void(T&>  function_pop_in );
    Wait_free_spsc_ios_queue( void );
    ~Wait_free_spsc_ios_queue( void );
   
  // 定义下列,  只需要push数据, 然后消费者会自动处理数据,
    void   set_ios_and_fuction_pop( std::shared_ptr<boost::asio::io_service>  sp_ios_pop_in, std::function<void(T&>  function_pop_in );
    void   set_function_after_pop_all( std::function<void(void)>  function_in );

    //  当定义下列项后,  生产者还会自动处理返回结果
    #ifdef  WAIT_FREE_SPSC_QUEUE_WITH_PUSH_CALLBACK
    void   set_ios_and_fuction_push_callback( std::shared_ptr<boost::asio::io_service>  sp_ios_push, std::function<void(T&>  function_push_in );
    bool   push_callback_empty( void) const;
    #endif // WAIT_FREE_SPSC_QUEUE_WITH_PUSH_CALLBACK

    bool   push( T& t_in );  //生产者执行
    void   push_util_success( T& t_in );

    bool   full( void ) const;
    bool   empty( void) const;
    size_t size( void ) const;
    size_t capacity( void ) const;
    bool   is_lock_free( void ) const;

    void   set_bool_fast_quit( bool bool_fast_quit );
    unsigned long long  get_push_count( void ) const;

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
119 [报告]
发表于 2017-02-20 22:12 |只看该作者
redis那个单线程IO,真不算高性能,只是满足大多数场景了。
看看aliredis吧,单机180w qps,集群1000w。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
120 [报告]
发表于 2017-02-20 22:14 |只看该作者
测试环境
CPU: Intel Xeon E5-2630 2.3GHz, *2
KERNEL: 3.2.0
GCC: 4.4.6
Jemalloc: 3.2.0
NIC: Intel 82599EB

测试数据
AliRedis单机版性能数据
thread:            1            2              4            8             12          16             20             24
set/get=1:1    83182  162214  301552 605817 876656 1173748 1551113 1800878

AliRedis集群
8个节点, 20台客户端, 配置相同, cpu全部打满.
set/get=1:1   qps: 10,344,877

结论
单机版AliRedis可以实现24核跑满180wQPS性能.
集群版可以实现8台服务器支撑1000wQPS的数据请求.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP