Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизЗасыпание серверного приложения (виноват файл-подкачки?). Найти похожие ветки
← →
serg_newone (2004-12-08 17:49) [0]Доброго времени суток, уважаемые мастера!
Написано серверное приложение (D7, CORBA, Win2000). Во время работы оно отжирает 300-500Мб памяти. Вся работа происходит через динамические массивы, инициализации которых происходит единожды (как правило, при старте приложения), фактически в них лежит статика (размерность и содержимое после инициализации не меняется).
Работает приложение в "вялотекущем" режиме (изредка приходят запросы). Помимо этого приложение на сервере крутится MSSQL (тоже вялотекущий). Сам сервер представляет из себя 2-х процессорную машину, 2гига памяти, Win2000.
Замечено засыпание приложения после "бездействия". А именно, результат отдается за 10 сек, вместо обычных 0.5сек. После того как отдастся 10-секундный результат приложение "просыпается" и работает в нормальном 0.5-секундном режиме (некоторое время).
Поиграв с SetProcessWorkingSetSize и проведя еще некоторый ряд "тестов" у меня сложилось впечатление, что отожранные 500Мб памяти по прошествию некоторого "бездействия" попадают в файл-подкачки, вызывая "засыпание" приложение.
Вопрос в том как "обмануть" операционку и не дать ей засунуть эти самые 500Мб в файл-подкачки. Мне думается, что копать нужно в сторону VirtualLock, но, честно говоря, у меня нет опыта работы на таком уровне с системой. Научите:). Еще в голову приходит вариант "пустого чтения" ("имитации работы") из массивов, но как-то это не красиво:).
Буду очень признателен за любые советы и комментарии, особенно если был опыт работы с подобными большими массивами.
← →
Anatoly Podgoretsky © (2004-12-08 17:57) [1]Даже если все 500 идут в своп, то это не означает, что из свопа в оперативку извлекаются обратно все 500 мб, если конечно не пробежаться по всему адресному пространству.
← →
Leonid Troyanovsky (2004-12-09 09:30) [2]> serg_newone (08.12.04 17:49)
> Написано серверное приложение (D7, CORBA, Win2000). Во время
> работы оно отжирает 300-500Мб памяти. Вся работа происходит
> через динамические массивы, инициализации которых происходит
> единожды (как правило, при старте приложения), фактически
> в них лежит статика (размерность и содержимое после инициализации
> не меняется).
Исходя из этого я бы предпочел создать свой файл размером
в 500 Мб, а в программе создать на него CreateFileMapping,
с не очень большим просмотром MapViewOfFile (скажем, на N*64К).
Ну, и массив будет не динамический, а статический, и проще
когда его куски будут целиком помещаться в окно.
Тогда, при обращении к элементу массива сначала вычисляется
адрес просмотра, просмотр переоткрывается и осуществляется
доступ к элементу (уже как обычно - элемент в памяти).
> Вопрос в том как "обмануть" операционку и не дать ей засунуть
> эти самые 500Мб в файл-подкачки. Мне думается, что копать
> нужно в сторону VirtualLock, но, честно говоря, у меня нет
> опыта работы на таком уровне с системой. Научите:). Еще
Нет большого смысла локировать те самые 500Мб, все равно,
запросу весь объем, наверняка, не потребуется.
> в голову приходит вариант "пустого чтения" ("имитации работы")
> из массивов, но как-то это не красиво:).
Многие серверы постоянно "причесывают" свои данные: проверяют
целостность, индексируют, резервируют, обнуляют страницы,
предсказывают ожидаемые запросы и т.д.
Т.е., чтение может быть и не совсем "пустым".
--
С уважением, LVT.
← →
serg_newone (2004-12-09 11:49) [3]>Leonid Troyanovsky (09.12.04 09:30) [2]
Давайте я чуть-чуть поподробнее обрисую ситуацию. Дело в том, что на один запрос все 500мб конечно не потребуются, но поскольку данные довольно сильно фрагментированы (и дефрагментировать их не предстовляется возможным) приходится "пробегать" (используя своеобразные индексы) по всем 500мб. Более того, поскольку приложение многопоточное может придти еще один запрос на совершенно другие данные. Мне думается, что использование MapViewOfFile с небольшим окном фактически приведет к чтению информации с диска, а не из памяти. Задача именно в уходе от использования диска. Серверное приложени должно отдавать данные в режиме "он-лайн", с очень желательной минимизацией по времени отдачи.
← →
Leonid Troyanovsky (2004-12-09 12:55) [4]> serg_newone (09.12.04 11:49) [3]
> Давайте я чуть-чуть поподробнее обрисую ситуацию. Дело в
> том, что на один запрос все 500мб конечно не потребуются,
> но поскольку данные довольно сильно фрагментированы (и дефрагментировать
> их не предстовляется возможным) приходится "пробегать" (используя
> своеобразные индексы) по всем 500мб. Более того, поскольку
Вот тут не очень понятно.
Если приложение в основном простаивает, то что ему мешает
сделать еще один файл размером в 500 мб, но уже упорядоченный.
Во-первых, при интенсивной (фоновой) работе приложения (потока)
меньше вероятность того, что его выгрузят.
А во-вторых, дефрагментация позволит уменьшить время
выполнения запроса в дальнейшем.
> информации с диска, а не из памяти. Задача именно в уходе
> от использования диска. Серверное приложени должно отдавать
> данные в режиме "он-лайн", с очень желательной минимизацией
> по времени отдачи.
Беда лишь в том, что VirtualLock не позволяет гарантировать
нахождение нужных _физических страниц_ в рабочем наборе.
Это, IMHO, возможно лишь на уровне драйвера,
т.е. это не ко мне :)
--
С уважением, LVT.
← →
serg_newone (2004-12-10 10:46) [5]> Вот тут не очень понятно.
>Если приложение в основном простаивает, то что ему мешает
>сделать еще один файл размером в 500 мб, но уже упорядоченный.
>Во-первых, при интенсивной (фоновой) работе приложения (потока)
>меньше вероятность того, что его выгрузят.
>А во-вторых, дефрагментация позволит уменьшить время
>выполнения запроса в дальнейшем.
Лучше упорядочить практически невозможно:). Какой смысл в еще одном файле? Только лишь пустая фоновая работа приложения, чтобы его не выгрузили? Как я уже писал выше - данное решение смотрится не очень красиво. Неужели единственный способ не дать среде выгрузить тебя в файл-подкачки - имитация работы?
← →
Leonid Troyanovsky (2004-12-10 11:24) [6]
> serg_newone (10.12.04 10:46) [5]
> чтобы его не выгрузили? Как я уже писал выше - данное решение
> смотрится не очень красиво. Неужели единственный способ
> не дать среде выгрузить тебя в файл-подкачки - имитация
> работы?
Я ж говорю, что зафиксировать страницы (для данных)
можно лишь на уровне ядра, т.е., видимо, написав драйвер.
Думаю, что дельфи для этого не очень полезна,
хотя недавно на rsdn это очень долго обсуждалось.
--
С уважением, LVT.
← →
serg_newone (2004-12-10 13:44) [7]Понятно, спасибо за советы!
Буду приделывать "холостое" чтение:().
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c