2017-02-10 47 views
9

Несколько дней назад я реализовал систему для автозаполнения предложений, которая работает со словарем в зависимости от языка. Вот как это работает: JQuery UI autocomplete -> вызов в файл .php -> вызов функции VB6 COM dll -> вызов файла .sqlite и поиск результатов на основе введенных букв -> возврат результатов в php -> возврат результатов в JS.sqlite & windows: Недостаточно памяти для завершения этой операции, и CoInitialize не был вызван

Он работает достаточно быстро, как в случае, для выполнения каждой операции требуется в среднем ~ 7 (миллисекунды). В часы пик Google Analytics показывает ~ 1200 онлайн-пользователей, и обычно каждый день мы получаем ~ half a million звонки на эту функцию.

Со дня эта система предложение автозаполнения пошел онлайн я начал замечать сотни двух очень конкретных сообщений об ошибках:

Not enough storage is available to complete this operation. 

CoInitialize has not been called. 

некоторая информация, которая может помочь:

а) появляются эти сообщения в основном во время пика Посетители: horus

b) Они не всегда отображаются только с определенной функцией, но и с другими (но никогда не было до того, как мы реализовали вышеупомянутую систему)

с) я использовал базы данных SQLite, прежде чем для других вещей (не так много «реального времени», хотя, как и в возвращающимся результаты, когда пользователь), но никогда не такая проблема появилась

г) размер SQLite файл составляет ~ 350 МБ с 3 таблицами, один из которых имеет ~ 2,2 млн записей, другой - 1,6 млн, а остальные - 16 тыс. записей и все необходимые столбцы индексируются.

е) Очевидно, что эта база данных используется только для чтения операций

F) После того, как система получает отключенными, все сообщения остановки.

г) я получаю около тысячи таких сообщений об ошибках каждый день для каждого сообщения (около 500,000 обращений к функции/день)

Серверная система состоит из двух (x2) Боксы: Core i7 4770 на 3, 8 ГГц, 32 ГБ оперативной памяти, Windows Server 2012 и IIS.

Сообщения появляются случайным образом и только в часы пик. Я не могу воспроизвести проблему на машине разработки. Поиск в Интернете до сих пор был бесплодным. Любые идеи о том, что вызывает это и как решить, были бы более чем приятными.

спасибо.

+2

Должен спросить, почему в середине есть компонент vb6 com? PHP может с радостью общаться непосредственно с SQLite. –

+0

Так как все инструменты для словаря начинаются, все операции происходят в vb6 com dll, есть вещи, которые потребуют много времени для переноса на php (что, вероятно, будет немного медленнее). повторная реализация этой конкретной функции в php была бы моим последним средством – MIrrorMirror

+0

Для вашего соединения с базой данных sqlite используются значения cache_size и page_size? –

ответ

1

Факт, что это временная проблема, которая возникает только при максимальном времени использования, - это довольно четкое указание, что что-то заканчивается из памяти - вероятно, ваша VB DLL (это, скорее всего, единственное место, где вызывается CoInitialize).

Я видел похожие проблемы со слишком большим количеством приложений и winDoze, заканчивающимися «системными дескрипторами». У меня есть окно с расширенным сервером w2K, которое я использовал в качестве настольной машины (потому что m $ не предоставить путь обновления от экземпляра AS к настольному компьютеру), обычно работает дюжина окон Explorer, WinSCP с 8-10 вкладками, несколько сеансов PuTTY, несколько ящиков DOS, подключения к удаленному рабочему столу, Firefox с 184 вкладками в 4 окна, просмотр Thunderbird 40 учетные записи электронной почты, WinAmp и некоторые другие - и PaintShopPro и PhpED просто делают , но не хотят работать одновременно из-за вышеупомянутого ограничения дескриптора системы.

Ваши проблемы возможно можно устранить, просто выбросив больше ОЗУ в проблему, но вы, вероятно, должны выполнить некоторую проверку производительности и проверить настройки системы для настройки.