Goahead 文件上传速度过慢原因分析
一、Goahead WEB请求处理流程:
开启侦听websOpenListen()-> 建立socket连接socketOpenConnection(NULL, port, websAccept, 0);并注册连接之后的响应函数websAccept;
主函数里轮训检测socket连接状态,当有连接,则相应websAccept函数;
当WEB有请求发出:
websAccept()-》创建socket处理函数socketCreateHandler(sid, SOCKET_READABLE, websSocketEvent, wp);并将socket.flags置为SOCKET_READABLE --> 进入socket事件websSocketEvent();根据socket.flags进行相应 的操作:如果为SOCKET_READABLE则为读事件--> websReadEvent(wp); 根据不同的wp.flags 和wp.states进行数据的读取,读完之后进入请求解析websParseRequest(),将wp相应标志置位,继续接受请求的数据,请求数据接收完毕,进行请求处理函数 websUrlHandlerRequest();从所有处理函数中找到请求处理函数(asp, form, cgi ...)最后关闭socket描述符,请求处理完毕。
回到主函数继续循环等待。
二、具体过程。
Main():
初始化
initWebs()
开启GOAHEAD服务
websOpenServer(port, retries);
开启侦听
websOpenListen()
建立socket连接, 并注册连接之后的响应函数websAccept();
socketOpenConnection(NULL, port, websAccept, 0);
当侦听到有连接,运行websAccept();
websAccept();
创建socket处理,设置socket可读标志,并注册socket事件websSocketEvent()函数。
socketCreateHandler(sid, SOCKET_READABLE, websSocketEvent, wp);
socket 事件websSocketEvent()函数。
websSocketEvent();
检测socket可读标志SOCKET_READABLE触发读wp数据事件。
websReadEvent(wp);
for(; ;)
按wp.flag和wp.state轮训读取wp数据
websGetInput();
wp->state = 1或者2时,解析数据的格式.
wp->state = 8时,接受上传文件的数据,并将其存入wp.postData;
数据读完关闭socket.
if (fd != -1) {
gclose (fd);
fd = -1;
}
上传文件数据接收完之后,进行WEB请求处理。
websUrlHandlerRequest(wp);
设置环境变量。如若上二进制文件,将其进行格式处理。
websSetEnv(wp);
调用请求处理函数(asp或form或。。。);
(*sp->handler)(wp, sp->urlPrefix, sp->webDir, sp->arg,
wp->url, wp->path, wp->query)(即:form_updateSystemFirmware);
释放内存结束WEB读事件。
if (text) {
bfree(B_L, text);
}
结束SOCKET事件。
继续回到主循环等待下一个请求。
while (!finished) {
if (socketReady(-1) || socketSelect(-1, 1000)) {
socketProcess(-1);//处理socket事件
}
websCgiCleanup();
emfSchedProcess();
}
三、 实验数据:
说明:我在websGetInput();取完数据之后在进入switch之前,添加了一打印语言,将wp->state属性打印出来。
printf("\twp->state = %d\n",wp->state);
switch(wp->state) {
case WEBS_BEGIN:
.
.
.
}
wp->state = 1 进入case WEBS_BEGIN:
wp->state = 2进入case WEBS_HEADER:
wp->state = 8进入case WEBS_POST_CLEN: (上传文件数据读取)
1. 传送较小的Makefile文件:
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 8
wp->state = 8
wp->state = 8
Get in the update form
fn (null)
bn /tmp/Makefile
begin to open file
begin to open file2222
begin to fwrite data
fwrite over
File close success
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
2. 传送较大的texthw
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
Get in the update form
fn (null)
bn /tmp/Makefile
begin to open file
begin to open file2222
begin to fwrite data
fwrite over
File close success
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
数据分析:从两次数据中不难得出,其中数据部分是wp->state = 8的部分,开关和结尾都是一样的,所以时间的长短应该就是打印wp->state = 8的多少。因为在wp->state = 2 转wp->state = 8的时候是进行的websParesRequest();请求解析,并改变wp.state为8,所以在前面的转折点是不会出现太多的延时,在wp->state = 8 转Get in the update form时这里就是前面提到的请求处理,同样不会有太多延时。综上,上传文件的速度原因,不是因为其它延时所致的。从websReadEvent();代码中所以看出,每次读完一部分数据就要将其放进postData,还有进行一系列的处理,如果读取次数过多,这部分代码执行的频率也越高,从尔时间也越多,所以在传送同样多的数据的时候,我们要尽可能少的减少这读取次数。目前来看,貌似只有增加每次读取数据的长度才能达到这样的效果。
综上:文件上传速度的关键在于每次读取文件数据的buffer大小!
改变buffer之后的实验数据:( 256 –> 1024 )
1. 传送较小的文件Makefile
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 8
Get in the update form
fn (null)
bn /tmp/Makefile
begin to open file
begin to open file2222
begin to fwrite data
fwrite over
File close success
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
2. 传送较大的文件testhw
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
wp->state = 8
Get in the update form
fn (null)
bn /tmp/Makefile
begin to open file
begin to open file2222
begin to fwrite data
fwrite over
File close success
wp->state = 1
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
wp->state = 2
3. 传送2M的文件系统也只用了10+秒。
改变这个buffer的大小,只是在传送的时候每次占用了1024的大小,而在传送完之后就释放了,所以不会有太大影响!
2012年7月24日 17:24:37