文件广播的实现

商户搜索索引高达22G(压缩之后10G),而replication有17台,尽管现在索引机出口带宽高达2Gb/s,下载还要花费15~20分钟。

用广播/组播方式可以节省出口,以及公用网络带宽, 早在两年前就有做广播工具的想法(当时是ipad会议系统,需要把文件分发到每台ipad上,ipad最多有700-800台,无线网络较差),憋了一段时间设计、整理思路、实现、调试,终于出结果了,感觉蛮有收获:

https://github.com/bryanzhang/ufbp

使用上类似http/ftp由客户端主动发起pull request,服务器端对同时请求同一个uri的多个客户端做下载调度。文件使用udp广播实现(以chunk为单位,一个chunk为60K),客户端请求,服务器端返回,以及客户端定时发送的已传确认包使用tcp。这样在较可靠的网络中,同时发起的请求可以共享文件数据,从而节省带宽。

在192.168.5.x的局域网内测试下载19G的索引,单台客户端下载带宽为188MBps,约3分10秒下载完,客户端增加到3台,3分25秒全部下载完(单台客户端下载带宽约170MBps)。对照nginx,单台客户端下载时约为100MBps,两台客户端同时下载花费6分5秒完成,平均到单台的下载带宽为62.7MBps(哈哈,写个服务器性能超过nginx真是爽啊:)

整个代码就1500行,服务器使用epoll(水平触发)单线程实现。这里面最有意思的就是调度器的算法,刚开始想对每个块都做优先级排序,后来想想块非常多,如果要完全用优先级,内存中的结构很大,关闭连接时的操作代价也很高。所以采用一种代价较低的公平调度方式,每次找最早收到ack的连接,先看waitforack队列是不是满的,如果满了,要发送其中不在那个uri的recentSendChunks的包,如果没满,chunkpos游标继续在文件中向前,总是不发送在recentSendChunks的包(近两秒该uri对应文件的包),可以尽量不重复发送。

广播对整体网络影响较大,改用组播达到的效果应该类似,但是不会全网传送。后来和老大、运帷讨论了一下,组播配置比较麻烦,升级出口网卡到万兆网卡,使用光线连接核心备板,只要花五六千块钱!不过写这个程序真是很有收获的尝试, 顶自己!

有不少可以改进的地方,因为公司暂时不需要这个好东西了一段时间内不会投入精力在上面,先列出来:

1.如果找不到可以调度的包(uri中所有数据都发完了,但未收到完整确认),要继续发送待确认数据,这样传输小文件不会浪费时间

2.uri请求建立起来之后,要清空该uri下的recentSendChunks

3.waitforack队列可以设大一点,如有必要的话

4.epoll中没有请求的时候,把udp OUT监听关闭,避免cpu 100%的问题

5.log可以整理更清楚一点(如使用glogs),甚至可以内潜一个打印状态的socket,看看性能瓶颈在哪里

6.组播实现,config用gflags

时间: 2024-10-07 20:49:27

文件广播的实现的相关文章

Linux学习之进程管理

|-进程管理     进程常用命令        |- w查看当前系统信息        |- ps进程查看命令        |- kill终止进程        |- 一个存放内存中的特殊目录/proc        |- 进程的优先级        |- 进程的挂起与恢复        |- 通过top命令查看进程        计划任务        |- 计划任务的重要性        |- 一次性计划at和batch        |- 周期性计划crontab    进程管理的概念

Android技术4:Android4.4中如何更新相册信息

当你到这篇文章时,你肯定遇到了在Android4.4版本中需要使用本地相册时,无法找到最新的照片这一问题.在Android4.4以前在需要获取手机本地图片信息时,只需要发送一个广播更新相册信息,然而系统更新到4.4之后该广播无效且报错. 广播如下: sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

Live UC随时随地开启面对面会议模式

人们总说,有事儿一定要面谈,为什么呢?因为面谈是最有效的沟通方式,在相互沟通时可以收集对方的表情.语气以及肢体语言.可以增加沟通双方的信任程度.但是问题出现了,如果距离太远时间又不充裕怎么办?没关系,Live UC来帮您!拿起手机立即注册,即可享受面对面远程通话.       Live UC视频会议系统,让我们更好的应变突发事件.您只需要一部智能手机,即可迅速发起远程会议,与会者无论身处何方,可立即收到邀请,利用现有的PC.智能手机.平板电脑.或者是硬件会议终端.PSTN电话加入会议.解决了距离

转://Oracle Golden Gate 概念和原理

引言:Oracle Golden Gate是Oracle旗下一款支持异构平台之间高级复制技术,是Oracle力推一种HA高可用产品,简称"OGG",可以实现Active-Active 双业务中心架构 一.Golden Gate 特点 1.实时数据复制 2.异构平台数据同步 3.支持断点续传,不影响系统连续运行 4.高性能,属于轻量级软件 5.保证数据引用完整性和事物一致性 6.整合ETL Tools Message Service 7.灵活拓扑结构 1:1 1:N N:1 N:N 双向

Fabric1.4源码解析:客户端创建通道过程

在使用Fabric创建通道的时候,通常我们执行一条命令完成,这篇文章就解析一下执行这条命令后Fabric源码中执行的流程. peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls true --cafile $ORDERER_CA 整个流程的切入点在fabric/peer/main.go文件中的main()方法 (本文中使用的是Fabric1.4版本,

最佳vim技巧

最佳vim技巧----------------------------------------# 信息来源----------------------------------------www.vim.org         : 官方站点comp.editors        : 新闻组http://www.newriders.com/books/opl/ebooks/0735710015.html : Vim书籍http://vimdoc.sourceforge.net/cgi-bin/vim

广播 布局文件代码

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.

(转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片

你曾想过从一个视频文件中提取图片吗?在Linux下就可以,在这个教程中我将使用ffmpeg来从视频中获取图片. 什么是ffmpeg?What is ffmpeg? ffmpeg是一个非常有用的命令行程序,它可以用来转码媒体文件.它是领先的多媒体框架FFmpeg的一部分,其有很多功能,比如解码.编码.转码.混流.分离.转化为流.过滤以及播放几乎所有的由人和机器创建的媒体文件. 在这个框架中包含有各种工具,每一个用于完成特定的功能.例如,ffserver能够将多媒体文件转化为用于实时广播的流,ffp

转: 从现实生活中理解什么是广播机制

来自:http://blog.sina.com.cn/s/blog_714338950100p4km.html 一听到广播我们第一感觉就会联想到小时候村里面的广播,每逢村里有什么活动都是通过广播发送的.收听收音机也是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同.接收广播时广播(发送方)并不在意我们(接收方)接收到广播时如何处理.好比我们收听交通电台的广播,电台中告诉我们现在在交通状况如何,但它并不关心我们接收到广播时做如何做出处理,这不是广播应该关心的问题,OK,到这里我