tyj07 发表于 2016-11-4 17:10:42

webserver网页多次刷新后无法响应

使用RT-Thread+Lwip在STM32F407上搭建了个Webserver,但是发现多次刷新页面后,程序会进入空闲线程无法再次触发netconn_accept()。而且多次刷新网页netconn_recv函数有时会返回ERR_TIMEOUT错误,提取到的newbuf也为NULL。检查了下整个过程netconn_recv申请的newbuf在函数末尾都用netbuf_delete清除了。用到的netconn也close了,应该没有什么内存泄露。我将RT_ETHLINKCHANGE_THREAD_PRIORITY的优先级也提升到最高了,pbuf的容量也相应的加大,但是没有任何变化。除了刷新网页之外,通过网页上的AJAX向板卡发送POST请求多次也会出现相同的问题,我想知道还有什么因素可以造成这样的问题。{:sad:}

aozima 发表于 2016-11-4 18:39:58

原因99.9是内存泄露,泄露点没找到而已。
继续查下。

tyj07 发表于 2016-11-5 11:53:17

aozima 发表于 2016-11-4 18:39
原因99.9是内存泄露,泄露点没找到而已。
继续查下。

通过finsh查看了下,发现每刷新一次网页都会申请一个TCP连接。刷新网页奔溃后,关掉浏览器上的该页面,系统好像才会清空所有申请的TCP连接。而且每次刷新网页接收的TCP都是用不同端口的,感觉像是打开了一个新的页面而不是在本页面上刷新。这是什么原因?

snowy 发表于 2016-11-5 12:57:57

刷新就是重新发送一系列HTTP请求,HTTP大多是短连接,下载完就释放的。

tyj07 发表于 2016-11-7 09:56:43

aozima 发表于 2016-11-4 18:39
原因99.9是内存泄露,泄露点没找到而已。
继续查下。

找到问题的原因了,是TCP_MSL设置的过大了。使TCP连接在TIME_WAIT状态时间过长,保存了2分钟才被删掉。要是在2分钟之内多次发送请求,TCP连接来不及删除就会把内存撑爆了。将TCP_MSL减小到30秒目前没有发现问题。

aozima 发表于 2016-11-7 10:00:23

tyj07 发表于 2016-11-7 09:56
找到问题的原因了,是TCP_MSL设置的过大了。使TCP连接在TIME_WAIT状态时间过长,保存了2分钟才被删掉。要 ...

不错,研究得挺深入的。
页: [1]
查看完整版本: webserver网页多次刷新后无法响应