Bug #51648 [Opn]: Memory leak in infinite loop

From: Date: Tue, 25 May 2010 13:29:01 +0000
Subject: Bug #51648 [Opn]: Memory leak in infinite loop
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-150793@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=51648&edit=1 ID: 51648 User updated by: shooreek at gmail dot com Reported by: shooreek at gmail dot com Summary: Memory leak in infinite loop Status: Open Type: Bug Package: SQLite related Operating System: WinXP SP3 PHP Version: 5.3.2 New Comment: php.ini modifications: -; extension_dir = "ext" + extension_dir = "ext" -;extension=php_sqlite3.dll +extension=php_sqlite3.dll My new test shows that "leak" behaves like caching. It seems to me that SQLite cache entire DB in memory until some limit. Here are the results. First row - date ad time, second - php.exe memory usage (from taskmgr), third - size of DB file. And so on. About 100,000 loops on virtual machine (real machine is to slow with hard disk). As you can see, cache limit, if any, is about 2Mb. 2010.05.25 16.13.32 php.exe 1 116 K 75 776 mysqlitedb.db --------------- 2010.05.25 16.16.31 php.exe 1 512 K 423 936 mysqlitedb.db --------------- 2010.05.25 16.19.31 php.exe 1 848 K 711 680 mysqlitedb.db --------------- 2010.05.25 16.22.30 php.exe 2 124 K 961 536 mysqlitedb.db --------------- 2010.05.25 16.25.30 php.exe 2 380 K 1 184 768 mysqlitedb.db --------------- 2010.05.25 16.28.29 php.exe 2 620 K 1 389 568 mysqlitedb.db --------------- 2010.05.25 16.31.29 php.exe 2 828 K 1 575 936 mysqlitedb.db --------------- 2010.05.25 16.34.29 php.exe 3 028 K 1 753 088 mysqlitedb.db --------------- 2010.05.25 16.37.29 php.exe 3 220 K 1 917 952 mysqlitedb.db --------------- 2010.05.25 16.40.29 php.exe 3 368 K 2 070 528 mysqlitedb.db --------------- 2010.05.25 16.43.29 php.exe 3 368 K 2 197 504 mysqlitedb.db --------------- 2010.05.25 16.46.30 php.exe 3 368 K 2 320 384 mysqlitedb.db --------------- 2010.05.25 16.49.30 php.exe 3 368 K 2 437 120 mysqlitedb.db --------------- 2010.05.25 16.52.31 php.exe 3 368 K 2 549 760 mysqlitedb.db --------------- 2010.05.25 16.55.32 php.exe 3 368 K 2 658 304 mysqlitedb.db --------------- 2010.05.25 16.58.32 php.exe 3 368 K 2 763 776 mysqlitedb.db --------------- 2010.05.25 17.01.33 php.exe 3 368 K 2 868 224 mysqlitedb.db --------------- 2010.05.25 17.04.33 php.exe 3 368 K 2 965 504 mysqlitedb.db --------------- I found on sqlite.org function sqlite3_soft_heap_limit(int) that limits the amount of heap memory that may be allocated by SQLite. But there is no such function in PHP SQLite extension. So, I don't think that this is a bug. Sorry for the panic :) Previous Comments: ------------------------------------------------------------------------ [2010-05-08 11:22:22] shooreek at gmail dot com Now I cannot provide exact information about modification of php.ini, but I can provide it later (two week's holiday). I modified memory_limit, post_max_size, extension_dir, uncommented some extensions like misql, mysqli, pdo_sqlite, sqlite3, curl. Nothing serious, only extensions from binary VC6 x86 Thread Safe (2010-Mar-04 20:11:08). As you can see, memory leak rate is not so great. You cannot reproduce leak at all, can you? ------------------------------------------------------------------------ [2010-05-07 16:51:42] crrodriguez at opensuse dot org Cannot reproduce in linux, tell us if you have 3rd party extensions installed as well if you have modified php.ini. maybe Pierre can check this one out.. ------------------------------------------------------------------------ [2010-05-07 13:19:50] shooreek at gmail dot com Pakage changed to SQLite related ------------------------------------------------------------------------ [2010-05-04 11:48:26] shooreek at gmail dot com cbandy, you are right: with UPDATE or SELECT queries mem usage remains constant. But with INSERT queries mem usage grows up. I discovered some way to free this memory: you should unlink SQLite DB file and create new one, because $db->close() is _not_ enough! May be there are another ways to do it, but I do not know about their existence. May be someone knows? I think it real bug and it should be fixed. So, it is SQLite extension related bug. There is no such problem in Mysqli. P.S. I first post I wrote that Mysqli have the same problem as SQLite. My fault. The problem was in multiple calls mysqli_init() function. With SELECT, UPDATE, INSERT or UPDATE commands Mysqli do not have memory leaks. If memory leaks related with multiple mysqli_init() calls is a bug, I can report it in separate. Just let me know. Thank you for your attention. ------------------------------------------------------------------------ [2010-05-02 16:24:23] cbandy at jbandy dot com Inserting an infinite number of rows could easily lead to mem usage within SQLite (not PHP). By executing only UPDATE in the loop, DB size should stay constant. Then results should show PHP-SQLite execution leaks. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/bug.php?id=51648 -- Edit this bug report at http://bugs.php.net/bug.php?id=51648&edit=1

« previous php.bugs (#150793) next »