Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP 7.0.29] Mysql memory leaks / 13 сообщений из 13, страница 1 из 1
23.10.2018, 11:22
    #39721327
spider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
Используется Yii 1.20, проблема в утечках памяти. Код довольно простой

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
   public function taskCorrectMainTables()
    {
        $db = \Yii::app()->dbProductStorage;

        $regionPropertyCount = $db->createCommand('SELECT COUNT(*) FROM region_property_count')->queryScalar();

        $offset = 0;
        $limit = 4096;

        $i = 0;

        while ($offset < $regionPropertyCount) {
            $a = $db->createCommand('SELECT region_id, property_count FROM region_property_count LIMIT ' . $offset . ', ' . $limit)->queryAll();

            foreach ($a as $b) {
                $regionId = $b['region_id'];
                $propertyCount = $b['property_count'];
                $db->createCommand('UPDATE region_en_bljfkhio SET property_count = ' . $propertyCount . ' WHERE region_id = ' . $regionId . ' LIMIT 1')->execute();
                $db->createCommand('UPDATE region_ru_bljfkhio SET property_count = ' . $propertyCount . ' WHERE region_id = ' . $regionId . ' LIMIT 1')->execute();
                $db->createCommand('UPDATE uk_bljfkhio SET property_count = ' . $propertyCount . ' WHERE region_id = ' . $regionId . ' LIMIT 1')->execute();
            }

            $c1 = $db->createCommand('SELECT COUNT(*) FROM `region_en_bljfkhio` WHERE property_count = 0')->queryScalar();

            $m = memory_get_usage();
            $m = $m / 1024 / 1024;

            echo($i . ' - ' . $c1 . ' - ' . $m .  "\n");
            $i++;

            $offset += $limit;

        }



Результат работы:

100 - 543978 - 1025.1407012939
101 - 543978 - 1034.8581771851
102 - 543978 - 1044.6429214478
103 - 543978 - 1054.2836227417
104 - 543978 - 1063.6922073364
105 - 543978 - 1073.1975021362
106 - 543978 - 1082.4176712036
107 - 543978 - 1091.5915756226
108 - 543978 - 1101.0670852661
109 - 543978 - 1109.7466659546
110 - 543978 - 1119.1266098022
111 - 543978 - 1128.387840271
112 - 543978 - 1137.9474105835
113 - 543978 - 1146.7601852417
114 - 543978 - 1156.1394577026
115 - 543978 - 1165.2169952393


Как видим потребление памяти постоянно растет. Можно перейти на mysqli, но это не особенно решает проблему.

Записей ~500000

Может кто-то сталкивался с подобной проблемой? Или может порекомендовать что-то?
...
Рейтинг: 0 / 0
23.10.2018, 12:25
    #39721363
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
spider13,

Зачем все эти тысячи апдейтов в цикле?
При беглом просмотре кода есть ощущение, что задача решается парой апдейтов.
...
Рейтинг: 0 / 0
23.10.2018, 12:26
    #39721364
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
spider13,

И, кстати, Limit без order by - рулетка. Нет никакой гарантии, что будут выданы именно те записи, которые нужно.
...
Рейтинг: 0 / 0
23.10.2018, 12:55
    #39721394
spider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
miksoftspider13,

Зачем все эти тысячи апдейтов в цикле?
При беглом просмотре кода есть ощущение, что задача решается парой апдейтов.

Не парой, а тремя запросами. Но таймаут довольно маленький и след запрос просто не успевает выполнятся.


miksoftspider13,

И, кстати, Limit без order by - рулетка. Нет никакой гарантии, что будут выданы именно те записи, которые нужно.

С данной таблицей работает только один скрипт, поэтому никаких проблем с ним не будет для MyISAM
...
Рейтинг: 0 / 0
23.10.2018, 14:20
    #39721458
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
превое что бросается в глаза - зачем делать createCommand в цикле? Сделай один раз перед циклом и используй.
...
Рейтинг: 0 / 0
23.10.2018, 14:21
    #39721459
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
gc collect cycle надо вызвать перед проверкой рахода памяти, он может не сразу мусор подчищать, чему тут удивляться...
...
Рейтинг: 0 / 0
23.10.2018, 15:53
    #39721523
spider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
Hettgc collect cycle надо вызвать перед проверкой рахода памяти, он может не сразу мусор подчищать, чему тут удивляться...

Пробовал, не помогает.

Hettпревое что бросается в глаза - зачем делать createCommand в цикле? Сделай один раз перед циклом и используй.

Пробовал, тоже разницы особо никакой.
...
Рейтинг: 0 / 0
23.10.2018, 16:13
    #39721528
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
давайте код, как стало выглядеть
не исключено что и в юии проблемы, или в какой-то либе, которую он использует
дебаг/трейс лог отключен?
у yii логгер может логи собирать и флашить раз в 1000 сообщений, может просто у вас еще флаша не произошло.
Вообще на скольки итеррациях тестировали?
...
Рейтинг: 0 / 0
23.10.2018, 17:18
    #39721576
spider13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
Hettдавайте код, как стало выглядеть
не исключено что и в юии проблемы, или в какой-то либе, которую он использует
дебаг/трейс лог отключен?
у yii логгер может логи собирать и флашить раз в 1000 сообщений, может просто у вас еще флаша не произошло.
Вообще на скольки итеррациях тестировали?

Весь код собственно в первом посте.
Дебаг и трейс включен, и возможно в эту сторону нужно компать, Вы правы.
Довольно таки много раз пробовал, результат один и тот же.
...
Рейтинг: 0 / 0
23.10.2018, 23:47
    #39721754
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
spider13Но таймаут довольно маленький и след запрос просто не успевает выполнятся.Какой именно таймаут?
Единые запросы будут выполняться ощутимо быстрее, чем показанный кусок кода.
...
Рейтинг: 0 / 0
24.10.2018, 11:40
    #39721942
Jude
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
spider13,

попробуйте другие варианты :

1) апдейт 1 запросом.
2) уменьшать количество ссылок, делая
Код: php
1.
$query = null;

или др решения, из области проверки подсчета ссылок
3) по поводу сборки мусора = да. но не мгновенно. это нужно учитывать :)
...
Рейтинг: 0 / 0
24.10.2018, 11:51
    #39721958
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
автор$query = null;
глупости
...
Рейтинг: 0 / 0
24.10.2018, 12:18
    #39721994
Jude
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[PHP 7.0.29] Mysql memory leaks
Hettавтор$query = null;
глупости

подобные рекоммендации встречал - было когда , типа , битых ссылок получалось - объект не очищался без этого.

про конкретный случай не уверен.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP 7.0.29] Mysql memory leaks / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]