Goahead 文件上传速度过慢原因分析

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值