php 内存相关问题

panda_yj 发布于 2013/06/05 16:47
阅读 451
收藏 0
PHP

做了个试验,用php不停的向mysql中插入数据如:

while(true){

$result=mysql_query ("insert into test(id) values ('1')");

}

会发现进程中的php内存消耗不停的增加,使用 memory_get_usage();却发现使用的内存没有变化,使用mysql_free_result()或是mysql_close();都没有效果,进程中的php内存还是不停增加,只有在插入之后添加sleep(1);再次运行,内存才稳定下来不增加。我想问问其中的问题到底在哪,内存开销在了什么地方是mysql的io问题么

加载中
0
欣儿
欣儿
估计在记录log,数据库io的操作
0
滔哥
滔哥
memory_get_usage  有跟着不断插入的时候重新不断的获取吗?
panda_yj
panda_yj
恩,是不断获取的,php换了5.4.16之后就没这问题了
0
飞晏
飞晏

你这要测试什么...  无限循环累死mysql?

这么个插入法,IO/锁都会消耗内存

0
上帝禁区
上帝禁区

这种操作不会造成内存持续消耗增加。内存释放问题PHP已经自己优化了。

所以这段代码运行后内存应该是相对平稳的,反而是CPU飙高不下。而sleep(1)作用是让出CPU资源。

下面截图一张,是一模一样的代码运行后(无sleep1),CPU与内存的变化:

php.exe进程内存平稳,基本没有变化,CPU使用率保持在15%左右,mysqld进程CPU使用率35%左右。

panda_yj
panda_yj
之前用的是ts版本的内存是增加的,后来使用的是nts版本内存就稳定了,你的应该也是nts版本的吧?
panda_yj
panda_yj
恩,今天换了5.4.16的版本和你的情况就一样了,内存稳定
0
傅小黑
傅小黑

去看一遍这篇文章

http://www.cnxct.com/libmysql-mysqlnd-which-is-best-and-what-about-mysqli-pdomysql-mysql/

老版本的mysql_*函数使用的libmysql.dll库,内存使用不受zend引擎控制,新版本php用的mysqlnd,被zend引擎控制。

你不停的insert会一直返回操作结果在mysql链接里,mysql_affected_rows可以操作,而且insert操作没有结果集free_result是没用的

panda_yj
panda_yj
恩,从这篇文章确实学到了不少东西,这次的内存消耗貌似与php的ts和nts版本有关,同样使用5.4.16的nts版本内存是稳定不增加的,使用ts版本,内存就不停上升
0
南湖船老大
南湖船老大
 memory_get_usage() 这个只是ZEND自己统计的数据,它不统计那一块当然就没有了。 这个数值是不可靠的,不代表应用使用的真正内存,仅代表Zend管理的内存的变化
0
pyruby
pyruby

你打开top看看,这是mysql在不断的消耗内存

0
剑啸枫
剑啸枫
楼主用的5.2吧  http://www.php.net/manual/zh/features.gc.php
panda_yj
panda_yj
回复 @宝仔love : 我后来换了5.4.16的试,ts版本的内存会增加,nts版本的内存则不会
pyruby
pyruby
回复 @panda_yj : 我的是5.2的,但是我没有说的你那样 php进程内存不断增加,是mysql在消耗内存
panda_yj
panda_yj
我使用的是5.4.5的版本,刚试了下5.4.16的版本就没有这问题了。
返回顶部
顶部