如何优化一个 Web 服务器的文件传输能力?我有4种方案

LENOVO_ 2010-09-29 06:37:23
如何优化一个 Web 服务器的文件传输能力

根据HTTP请求,获取URL,笔者在这里指定为filepath
方案一:

1、根据filepath打开文件;
2、获取文件大小filesize,申请filesize大小的内存;
3、关闭文件;
4、每次send 4KB大小的数据到请求方,直到全部发送;
5、释放申请的内存。

测试现象:1个700MB的文件被同时请求2次,第2次即申请内存失败
测试结果:方案不可行

方案二:

1、根据filepath打开文件;
2、char buff[4*1024]={0},每次读4KB数据,发送4KB数据,直到全部读取;
3、关闭文件;

测试现象:对1000个请求,CPU使用率50%
测试结果:效率过低

方案三:

1、将所有的文件事先CreateFile,CreateFileMapping,MapViewOfFile;
2、建立对应关系 filepath <-> address of MapViewOfFile;
3、根据filepath获取对应的address;
4、char *p=address,char buff[4*1024]={0},每次读4KB数据,发送4KB数据,直到全部读取;
5、无限循环
6、UnmapViewOfFile,CloseHandle,CloseHandle,程序结束

测试现象:对1000个请求,CPU使用率10%
测试结果:比较满意

方案四:

1、根据filepath打开文件;
2、使用Microsoft扩展函数TransmitFile函数,发送数据;
3、关闭文件

测试现象:对1000个请求,CPU使用率8%
测试结果:比较满意

上面是我测试的结果,大家看看,评评,哪种方案最好,
有没有更好的方案?
...全文
113 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xgPaul 2010-10-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lenovo_ 的回复:]
人工置顶。

蜂王,能说说你有什么更高效的方法吗?
[/Quote]
方案3,可以啊,对于大文件,就应考虑用内存映射文件来进行操作。。。
zhaojianwei 2010-10-04
  • 打赏
  • 举报
回复
说的有歧义了。选方案3。
方案1这种太扯淡了。。
zhaojianwei 2010-10-04
  • 打赏
  • 举报
回复
方案3,方案1是扯淡
liyan 2010-10-04
  • 打赏
  • 举报
回复
看到方案一,牙就酸了,这样也行?

连接池方案!

楼主能这么想优化问题,倒也独特!

我听到一位BCB程序员说过Borland在关键的时候
都用线程阻塞,一定有他的道理。
我还听过一位VC程序员说过
线程阻塞式不能用于太多连接的服务器。
看完他俩的源码后,WEB性能这块,我就脑残了!
不想它了,只想解决容错的问题!
楼主怎么解决的?没敢看你写的东西,阻塞不啊!
哈哈!
纯楼过,无心看你的方案!
lijianli9 2010-10-04
  • 打赏
  • 举报
回复
方案3
LENOVO_ 2010-09-30
  • 打赏
  • 举报
回复
人工置顶。

蜂王,能说说你有什么更高效的方法吗?
LENOVO_ 2010-09-30
  • 打赏
  • 举报
回复
顶一个。求好思路。
xgPaul 2010-09-29
  • 打赏
  • 举报
回复
方案三,用内存映射文件操作。。。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧