- 浏览: 2652419 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
一、简介
Sofa 源于 Minisite 重构项目,也许您会问,已经有如此众多的 memcahced 客户端,为什么还要再来一个,我们经常会说,不要尝试去重复造轮子。是的,但如果我们有一种不同的思路来制造这个轮子,并且它有可能会做得更好,那为什么不试试看呢?基于此,才有了 sofa 。
二、 Sofa 的愿景
在不额外增加太多成本的情况下,更快速、高效的收发数据。
三、 sofa 的前辈们
在介绍 Sofa 的实现原理之前先简要了解一下,部分目前常用 Memcached 客户端的基本实现原理。
Spy :
Spy 在处理命令时也利用了批量发送及接收的机制,但其数据的收发都是基于 Selector 处理线程,特点在于:
1. 读写都在一个线程中执行;
2. 写数据是先往 socket 中写,写不完则注册写监听;这种机制的缺点在于,在一次处理不完数据的情况下,写入数据的代码会被多执行一次(一次写循环,另外一次在写事件处理过程中);而且大部分情况下命令都是一个个被写入 socket 中,整体来看,这种模式会影响高吞吐量情况下的收发效率。
3. 读数据完全依赖 socket 的读事件来执行。
4. 命令本身是批量发送,但每个命令请求都会唤醒 Selector ,结果造成 Selector 被多次唤醒,执行过多的空循环。
另外: spy 的 Selector 线程会根据 Client 创建而自动生成,如果创建多个 client ,那么就会创建多个 Selector 线程;
Xmemcached :
同 Spy 不同, XM 完全基于 Socket 的 IO 事件来驱动 IO 读写(在 Selector 处理线程中实现读写操作),任何命令读写都会直接注册读写相关的 IO 事件,然后等相应事件产生则往 IO 中写入或读取数据。
与 Spy 的主要区别在于:
1. spy 是先写数据,写不了才注册写事件,而 XM 则完全基于 IO 事件实现。
2. spy 会批量发送数据,而 XM 可以合并多个 Get 命令为一条 GETS 命令;
3. xm 的 Selector 线程数是根据当前服务器的可用处理器个数来创建;
XMemcached 的核心 Selector 的代码写得相当精巧,整体性能表现稳定;
Danga :
由于之前测试的版本是基于阻塞式 IO 实现,其在吞吐量及相应速度方面要相差一个数量级,所以一直没有太多的关注,在此不做太多评价。但由于其是 Memcached 最早的 java 客户端,使用比较广泛,稳定性也不错。
Cat ( Alibaba 自己的 Memcached Client 实现):
Cat 的实现类似 spy 但又有所不同,类似点在于:写数据在 Selector 线程中执行,如果数据没有写完,才注册写事件。但其 Selector 线程数量计算方式有点特别,如果处理器小于 8 核,则只创建一个 Selector 线程,否则创建 4 个 Selector 线程;另外, Cat 的实现基于连接池的实现机制,对于同一个 Memcached Server , Cat 会根据并发请求数,创建对等的 TCP 连接( TCP 模式下)。在我的测试机上,如果 50 个并发, cat 会同时建立 50 个 TCP 连接。最后一个不同点是 Cat 的命令收发都是独立的,即每个命令都会单独占用一个 socket 来发送和接受,直到处理完当前命令, socket 才空出来给下一个命令使用 , 没有批量发送和命令合并的功能。但通过多个连接可以实现类似批量发送的功能,整体卡端的 IO 复用率还是比较高的。
四、 sofa 的特点:
1. 收发并行的工作模式,写入时直接往通道中写入数据,读取完全依赖IO 通道中的读事件。
2. 批量处理命令的工作模式: a 、命令的批量发送, b 、多个 get 命令自动合并成一个 gets 命令
3. 基于 nio 的收发模式,可以同时管理多个连接,并且在请求线程急剧增加的情况下,整个收发效率变化平稳。
4. 支持所有 memcached 的标准命令,并且支持二进制和字符串两种命令格式。
5. 支持 direct buffer 模式读取数据(目前只支持 Text 命令模式)。
五、 Sofa 的实现原理:
Sofa 的实现和上述的几个客户端有很大的区别,首先是 sofa 数据收发模式,读写是并行执行的,如下图:
同样在读取数据时也采用类似的机制来实现,由于网卡本身都是全双工的方式工作,因此在多核的系统中,读写的并行可以极大的增加单个连接的数据吞吐量,同时在写 入数据时, sofa 的实现方式是首先尝试直接写,只有底层 socket 中无法写入数据时,才向 selector 注册相关的监听事件,在 Memcached Server 这种请求响应时间几乎恒定的服务器支撑下,可以极大的减少同 selector 的交互次数,在压力测试机上测试统计发现,约 90% 的数据都可以不通过 selector 而直接从 socket 中写入。
其次、 sofa 也采用同 spy 类似的方式,为每个 socket 都维护了一个命令队列,发送时系统从命令队列中获取一批命令数据,并将其一次性发送给 memcached 服务器端,同时对于多个 Get 命令, sofa 会自动合并成一条 Gets 命令,这样可以减少数据发送时往网卡缓存写入数据的次数,进而减少底层网络数据的发送次数 。
最后、 sofa 对命令数据的压缩和解压操作都不放在核心读写线程来实现,为了保证读写线程的高效率,这些操作全部转移到请求线程来处理。
六、性能测试
附件是 spy , xmemcached , sofa , cat 之间的性能测试对比 , 性能测试对比图:见附件
性能对比测试粗略分析 :
测试 Client 在 1 、 5 、 10 、 20 、 50 、 100 、 150 、 200 个并发线程模式下,各个 client 的整体吞吐量 TPS (第一列图)及在当前压力下随机读写两次数据的响应速度测试(第二列图)。
1. 吞吐量( TPS ):
从图中可以看到在大部分情况下, sofa 能够获取更高的吞吐量( 20% ~ 100% 左右的性能提升),有些场景 TPS 会有近 1 倍的提升。
但 XM 整体的稳定性较好,随着线程数和数据量大小的增加,各方面性能表现都比较稳定;
2. 压力测试下,随机访问速度测试:
测试在相应的并发压力下,随机访问的性能对比, sofa 总体而言和 xm 系统差不多,甚至某些情况下还会稍微快些。
-
连接数:
xm 、 spy 、 sofa :在所有场景下都只是用了一个 TCP 连接;
cat :连接数随并发数增加而增加,每个并发会对应一个 TCP 连接;
七、 Sofa 的未来 :
说实话,我也不是太清楚,如果你喜欢或者有兴趣,或许可以和我一起来完善它,我相信Sofa 还存在很大的优化空间,占有更少的系统资源,获取更快的收发速度;
如果想在自己的产品中尝试使用它,对 sofa 而言绝对是个好消息,不管如何,它都需要大家的支持才有可能能走得更远 、 更好。
未来计划:
加入更多的异常处理机制,诸如连接自动重建,多备份数据读写等等;
加入 UDP 的支持
优化核心模块,让其占用更少的资源消耗,尤其是内存分配与释放相关的部分。
发表评论
-
xmemcached 源代码简单记录
2012-12-13 15:14 940XMemcachedClient.set() 1. ... -
python-memcached client 性能分析
2012-11-11 12:41 917前面python-memcached client 性能问题 ... -
python-memcached client 性能问题
2012-11-09 12:02 1539线上发现memcached偶发超过100ms的情况,刚开始以为 ... -
线程安全的纯python-memcached客户端
2012-10-21 15:06 2050前面测试过python-memcached客户端通过threa ... -
集中化管理memcached的想法
2012-10-21 14:14 1017现在线上web服务器都是直接使用memcached,虽然简单但 ... -
安装libmemcached
2012-10-12 23:32 1801libmemcached是一个c编写的高性能,线程安全的mem ... -
python-memcached的线程安全问题
2012-10-12 15:40 4026答案是肯定的,前提你在使用Python 2.4+和python ... -
使用libmemcached提速memcached的操作
2012-10-12 13:32 1116... -
对memcaced的python客户端测试
2012-10-12 11:34 1271在线上发现python-memcached客户端很有问题,我在 ... -
memcached客户端比较
2012-07-21 16:36 0一、简介 Sofa 源于 Mi ... -
memcache mutex设计模式
2012-07-21 14:19 0Mutex主要用于有大量并发访问并存在cache过期的场合,如 ... -
使用memcache实现高并发计数器
2012-07-21 14:08 6626在网站中很多场景都有 ... -
淘宝在Memcached使用记录
2012-07-21 14:04 5434原文:http://blog.csdn.net/cenwenc ... -
memcache的API
2012-07-21 13:55 710php版本的API:http://www.php.net/ma ... -
memcached协议
2012-07-21 13:36 775协议 memcached的客户端通过 ... -
一致性 hash 算法( consistent hashing )
2012-07-21 12:42 873原文:http://num7.iteye.com/blog/7 ... -
memcached的一些总结
2012-07-13 17:38 1279我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql s ... -
memcached 内存分配(slab和chunk)
2012-07-13 16:43 7263开启memcached:memcached -d -m 10 ... -
memcached telnet
2012-07-13 16:06 1077memcached没有client工具来查看状态,只提供tel ... -
memcache中的key为什么要用md5处理
2012-06-15 17:55 1365官方的说法是: “A few years ago, we ...
相关推荐
SOFABoot 是一个完全兼容 SpringBoot 的开发框架,rpc-sofa-boot-starter 的作用就是将 SOFARPC 功能集成到 SOFABoot 中。rpc-sofa-boot-starter 提供了统一方便的编程界面、配置方式,同时提供了 SOFABoot 的健康...
基础天文标准库(Standards Of Fundamental Astronomy,SOFA)是IAU赞助的项目,旨在为天文计算提供权威有效的算法程序和常数数值。1994年的IAU大会上,IAU天文标准工作组 提出了创立SOFA的提案。1997年,SOFA评审...
基础天文标准库(Standards Of Fundamental Astronomy,SOFA)是IAU赞助的项目,旨在为天文计算提供权威有效的算法程序和常数数值。1994年的IAU大会上,IAU天文标准工作组 提出了创立SOFA的提案。1997年,SOFA评审...
SOFA RPC 是阿里巴巴开源的一款高性能、灵活且易用的分布式服务框架,它为微服务架构提供了强大的服务调用能力。本示例是一个基于 SpringBoot 的 SOFA RPC 实践项目,旨在帮助开发者快速理解和使用 SOFA RPC。下面...
**IAU SOFA库详解** IAU(International Astronomical Union,国际天文学联合会)SOFA(Standards of Fundamental Astronomy,基础天文学标准)库是一个广泛使用的软件库,旨在为天文学、地球物理学以及相关领域的...
SOFA库,全称为"Software for Fundamental Astronomy",是由国际天文学联合会(IAU)提供的一个重要的开源软件库。这个库包含了用于天文计算的各种函数,旨在为科学家、工程师以及任何需要进行精确天文计算的用户...
SOFA 微服务开发框架介绍 SOFA 微服务开发框架是由 百度网页搜索部 郑然架构师团队开发的一款微服务开发框架,旨在解决微服务开发中的各种难题,提高开发效率和系统可维护性。该框架的设计理念是基于接口和实现分离...
[] ...Just install this comfy sofa into your application: public class MainApplication extends Application { @Override public void onCreate
在`sofa-boot-guides.zip`压缩包中,我们可以找到关于SofaBoot的源码和使用示例,其中可能包含了如何在SofaBoot项目中应用策略模式的实例。通过研究源码和示例,我们可以深入理解如何在实际开发中利用策略模式来优化...
SOFARPC是一款由阿里巴巴开源的高性能、高可扩展性的Java Remote Procedure Call (RPC)框架,专为生产环境设计。这个框架旨在简化分布式系统的服务调用,提供了一套完整的解决方案,包括服务注册、服务发现、负载...
SOFA架构DEMO是一个用于演示和学习分布式系统开发的实例,它基于阿里巴巴开源的SOFA(Scalable Open Financial Architecture)框架。SOFA是专为金融级应用设计的一套高可用、高性能、可扩展的分布式服务框架。在这个...
SOFARPC SOFARPC 是一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供方便透明、稳定高效的点对点...
SOFA-RPC 是阿里巴巴开源的一款高性能、高可扩展性、企业级的Java远程过程调用(RPC)框架。它的设计目标是简化分布式服务之间的通信,提高系统的解耦性,并提供丰富的功能来支持微服务架构。在本文中,我们将深入...
《SOFARPC框架v5.12.0深度解析》 SOFARPC,全称为Simplified Open For阿里的Remote Procedure Call,是阿里巴巴开源的一款高性能、轻量级的RPC框架,广泛应用于分布式系统中。SOFARPC v5.12.0作为其重要的版本迭代...
sofaboot关于spring boot项目的实例代码,包含sofaboot的客户端和服务端代码,导入之后,可直接运行SofaDemoServerApplication.java和SofaDemoClientApplication.java
《SOFATracer分布式链路跟踪组件:深入解析与应用》 SOFATracer是一款由Alibaba开源的分布式链路跟踪组件,主要用于解决微服务架构中的调用链路追踪问题,帮助开发者理解分布式系统中的请求流程,定位性能瓶颈,...
SOFABoot是一个由蚂蚁金服推出的增强型Spring Boot框架,其设计目标是为大型分布式系统的开发提供更加高效、稳定和可扩展的解决方案。这个框架在保持与Spring Boot完全兼容的同时,引入了一系列特色功能,旨在提升...
为了解决 Spring Boot 下的类依赖冲突的问题,SOFABoot 基于 SOFAArk 提供了 Spring Boot 上的类隔离的能力,在一个 SOFABoot 的系统中,只要引入 SOFAArk 相关的依赖,就可以将 SOFA 中间件相关的类和应用相关的类...
SOFA(Standards for the Exchange of Fundamental Astronomical Data)是一套由国际天文学联合会(IAU)推荐的C语言库,主要用于天文和大地测量计算。这个名为"sofa_c-20120301.rar"的压缩包包含了2012年3月1日版本...