redis是个单线程的程序,为什么会这么快呢?
纯内存数据库,如果只是简单的 key-value,内存不是瓶颈。一般情况下,hash 查找可以达到每秒数百万次的数量级。
瓶颈在于网络 IO 上。
根据你测的的 10000/s 来看,客户端和 redis 应该是部署在两台不同的机器,并且是使用同步的方式请求 redis 每次请求需要通过网络把请求发送到 redis 所在的机器,然后等待 redis 返回数据。时间大部分消耗在网络传输中。
如果把 redis 和客户端放在同一台机器,网络延迟会更小,一般情况下可以打到 60000 次每秒甚至更高,取决于机器性能。
锁不是影响性能的主要因素。线程锁 (mutex_lock) 只有在遇到冲突的情况下性能会下降,而正常情况下,遇到冲突的概率很低。如果只是简单的加锁、释放锁速度是非常快的,每秒钟上千万次没问题。memcache 内部用到了大量的锁,并没有见到性能降低。
线程也不是影响吞吐量的重要因素。如第一点来说,一般情况下,程序处理内存数据的速度远高于网卡接收的速度。使用线程好处是可以同时处理多条连接,在极端情况下,可能会提高响应速度。
使用 epoll 或 libevent 等因为异步非阻塞 IO 编程只能这么做。与之对应的是同步阻塞 IO 编程,使用多进程或多线程实现多条连接的处理,比如 apache。一般情况下,异步非阻塞 IO 模型性能是远高于同步阻塞 IO 模型的,可以参考 nginx 与 apache 性能的对比。
libevent 并不比 redis 自己实现的 ae_event 慢,代码多是应为 ae_event 只实现了 redis 需要的功能,而 libevent 则具有更多的功能,比如更快的定时器、buffer event 模型,甚至自带了 DNS、HTTP 协议的处理。并且 libevent 更通用,而 redis 只专注于 linux 平台。
最后回答问题,快在哪? 1、纯内存操作 2、异步非阻塞 IO
如果是学习的话我推荐你去看看Linux、FreeBSD系统中与网络有关的那些命令程序的代码,比如ping、tcpdump等等,他们还有很多更强大的开源替代方案,比如mtr,都是学习的好材料。这些程序都追求把一件事情做到极致,所以往往结构清晰却又不会过于简单,你看看光是下载就有wget和curl两大神器够你折腾了。Linux和FreeBSD的这类自带命令虽然功能相同,但往往实现方式有很大差别,对比阅读效果甚好。
ebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写,代码实在太简洁,源码加起来不到600行。下载链接:GitHub-EZLippi/WebBench
Tinyhttpd是一个超轻量型HttpServer,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个HttpServer的本质。下载链接链接:GitHub-EZLippi/Tinyhttpd
高性能web服务器nginx:download
C语言写的事件驱动框架libevent/libevent·GitHub
ACE:C++面向对象网络变成工具包
BoostAsio:用于网络和底层I/O编程的跨平台的C++库
Casablanca:C++RESTSDK
cpp-netlib:高级网络编程的开源库集合
Dyadc:C语言的异步网络
libcurl:多协议文件传输库
Mongoose:非常轻量级的网络服务器
Muduo:用于Linux多线程服务器的C++非阻塞网络库
net_skeleton:C/C++的TCP客户端/服务器库
nopec:基于C语言的超轻型软件平台,用于可扩展的服务器端和网络应用。对于C编程人员,可以考虑nodejs
Onion:C语言HTTP服务器库,其设计为轻量级,易使用。
POCO:用于构建网络和基于互联网应用程序的C++类库,可以运行在桌面,服务器,移动和嵌入式系统。
RakNet:为游戏开发人员提供的跨平台的开源C++网络引擎。
Tufo:用于Qt之上的C++构建的异步Web框架。
WebSocket++:基于C++/BoostAiso的websocket客户端/服务器库
ZeroMQ:高速,模块化的异步通信库
这个网站整理的比较全,可以看看ezlippicom的页面另外编写高性能web服务器当然离不开缓存啦,可以关注下Redis和Memcached
很早就听说了zeromq 这个项目,当时不太在意后来同事kasicass 对这个项目做了研究和分享 ,开始重视起这个项目来1) libevent封装了对网络I/O,信号,定时器等的处理,可以基于它之上做网络层的开发2) ACE封装了不同平台下的系统调用,也提供好几种网络编程的模型然而,zeromq不是libevent,也不是ACE,因为它的主要特性是:面向消息进行通信所以,它提供的是比libevent,ACE处在网络通信中更高一层的组件使用它,程序员不再需要上面提到的libevent,ACE之类的库需要关心的东西,程序员如果要使用zeromq,只需要做如下的事情:1) 告知所使用的patten,比如request-reply,pub-sub,push-pull等(下面会详细解释这个pattern)2) 告知是用于机器之间,还是进程之间,线程之间的通信然后,将所需要发送的数据封装到zeromq自带的msg结构体中发送出去,使用者自己关心如何序列化/反序列化这些数据,然后如何处理这些数据就是使用者的事情了这样看上来,使用者要关注的事情”高”了一层,大部分的精力都可以放在业务逻辑之上了简而言之,它让使用者的精力放在了通信模式和业务逻辑上,而不是更下面一层的网络层上下面解释一下zeromq常用的几种网络pattern:1) request-reply就是一般的C/S架构中,client与server之间一问一答的通信模式,比如最经典的echo服务需要注意的是,client发送一个request,server必须有一个回应server端作为publish端,而任何连接到服务端的client都会成为subscribe端也就是说,server端会把当前的所有需要publish出去的消息全部发送到当前连接上去的client上3) push-pullserver端作为push端,而client端作为pull端如果有多个client端同时连接到这个server,则服务器会在内部做一个负载均衡,采用平均分配的算法,将所有的消息均衡发布到client端上看上去,很稀松平常接下来亮点真的来了考虑如下一种场景一个server端做为一组服务器集群最上层的一个proxy,起到负载均衡的作用,将请求按照它下面对应服务器集群依次派发到不同的 client端进行处理某个时刻可能处理的机器只有2台,而随着负载越来越大,可能需要3台机器了,这个时候如果使用zeromq的push-pull 搭建的proxy端,则可以不用对之前搭建的server,client端进行停机,只需要新启动一个client连接上去,proxy层就会自动根据当前的机器分配平均派发任务了cool实际上,这些模式并不是什么新东西,只不过zeromq为使用者做了一个封装,而不是像libevent,ACE等还局限在网络层部分的封装,它关注的是通信层,通信模式等个人感觉,zeromq部分解决 了erlang所要解决的问题:在多台机器中通信,派发任务等,是分布式通信的利器,但是局限于语言的限制,它没有办法做的跟erlang一样的完善(erlang已经可以算的上一个简易微型的OS了),但是许多的时候,似乎只使用这一部分功能也就足够了zeromq的代码量,截至到我目前阅读的2010-stable版本,也只有不到2W行代码提供出去的API也极为简单,但是内部的实现比较”绕”,zeromq是我阅读过的项目中少数的非常需要依赖调试工具跟进代码才能看懂代码流程的项目,同时代码中类的继承层次也比较多,阅读起来并不像它提供的API那样简单直白后续会对其中的一些难点做一些分析
Google了一下,流行的开源分布式文件系统有很多,介绍如下:
mogileFS:Key-Value型元文件系统,不支持FUSE,应用程序访问它时需要API,主要用在web领域处理海量小,效率相比mooseFS高很多。
fastDFS:国人在mogileFS的基础上进行改进的key-value型文件系统,同样不支持FUSE,提供比mogileFS更好的性能。
mooseFS:支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多
glusterFS:支持FUSE,比mooseFS庞大
ceph:支持FUSE,客户端已经进入了linux-2634内核,也就是说可以像ext3/rasierFS一样,选择ceph为文件系统。彻底的分布式,没有单点依赖,用C编写,性能较好。基于不成熟的btrfs,其本身也非常不成熟。
lustre:Oracle公司的企业级产品,非常庞大,对内核和ext3深度依赖
NFS:老牌网络文件系统,具体不了解,反正NFS最近几年没发展,肯定不能用。
鉴于fastDFS是国人开发,也有国内的一些大公司在使用,so…
普通的文件架构其实一两年内也是没有问题的,但有句话叫未雨绸缪,于是决定折腾折腾。
源码下载:
寻求帮助:
一、安装libevent
fastDFS需要安装libevent比较新的版本,将本机的比较低的版本卸载了。
rpm -qa libevent
libevent-1413-1el6x86_64
rpm -e --nodeps libevent
安装一个最新稳定版
wget
tar zxvf libevent-2018-stabletargz
cd libevent-2018-stable
/configure
make && make install
为libevent创建软链接到/lib库下,64位系统对应/lib64
ln -s /usr/local/lib/libevent /lib/
ln -s /usr/local/lib/libevent /lib64/
二、安装FastDFS
wget
tar zxvf FastDFS_v306targz
cd FastDFS
/makesh
/makesh install
三、配置FastDFS
环境:
tracker server
19216815
storage server
192168151
192168152
1、配置并启动 tracker server
①配置 trackerconf
mkdir /data/fastdfs
vim /etc/fdfs/trackerconf
base_path=/data/fastdfs
②启动 tracker
/usr/local/bin/fdfs_trackerd /etc/fdfs/trackerconf
③开机启动
vim /etc/rclocal
/usr/local/bin/fdfs_trackerd /etc/fdfs/trackerconf
2、配置并启动 storage server
①配置 trackerconf
mkdir /data/fastdfs
mkdir /data/images
vim /etc/fdfs/storageconf
base_path=/data/fastdfs
store_path0=/data/images
tracker_server=19216815:22122
②启动 tracker
/usr/local/bin/fdfs_storage /etc/fdfs/storageconf
③开机启动
vim /etc/rclocal
/usr/local/bin/fdfs_storage /etc/fdfs/storageconf
3、为storage节点安装fastdfs-nginx-module模块
①安装模块
安装Nginx详见:
需重新编译Nginx
wget
tar zxvf fastdfs-nginx-module_v110targz
wget
tar zxvf nginx-120targz
cd nginx-120
/configure --prefix=/usr/local/nginx --add-module=/fastdfs-nginx-module/src
make && make install
cd
②配置
编辑nginxconf
vim /usr/local/nginx/conf/nginxconf
server {
listen 80;
server_name localhost;
location /M00 {
alias /data/images/data;
ngx_fastdfs_module;
}
}
给 storage 的存储目录做一个软连接
ln -s /data/images/data/ /data/images/data/M00
拷贝mod_fastdfsconf 到 /etc/fdfs/
cp fastdfs-nginx-module/src/mod_fastdfsconf /etc/fdfs/
vim /etc/fdfs/mod_fastdfsconf
base_path=/data/fastdfs
tracker_server=19216815:22122
store_path0=/data/images
启动nginx
/usr/local/nginx/sbin/nginx
四、使用FastDFS
1、上传文件
FastDFS安装包中,自带了客户端程序,通过程序可以进行文件上传。在使用这个客户端程序之前,首先需要配置clientconf,然后再进行文件上传及下载。
在tracker上修改客户端配置文件clientconf
vim /etc/fdfs/clientconf
base_path=/data/fastdfs
tracker_server=19216815:22122
vim ahtml
This Is FastDFS Test
上传文件
/usr/local/bin/fdfs_test /etc/fdfs/clientconf upload ahtml
This is FastDFS client test program v306
Copyright (C) 2008, Happy Fish / YuQing
FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit
Please visit the FastDFS Home Page /
for more detail
[2012-04-29 12:42:53] INFO - base_path=/data/tracker, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0
tracker_query_storage_store_list_without_group:
server 1 group_name=group1, ip_addr=192168151, port=23000
server 2 group_name=group1, ip_addr=192168152, port=23000
group_name=group1, ip_addr=192168151, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKgBM0-cxs32qFyYAAAADigvbpc90html
source ip address: 192168151
file timestamp=2012-04-29 12:42:53
file size=14
file crc32=674197143
file url:
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKgBM0-cxs32qFyYAAAADigvbpc90_bightml
source ip address: 192168151
file timestamp=2012-04-29 12:42:53
file size=14
file crc32=674197143
file url:
上传成功
试试用
访问看看吧。
看了几天了,还是有些地方不是很明白,暂时搁置,不能再浪费时间了。
0条评论