Препятствование тому, чтобы тяжелый процесс впитал файл подкачки

Я думаю, вы хотите что-то вроде этого:

SELECT      @@servername as [HostName]
,           @VID2 as [V-ID]
,           @STIG AS [STIG]
,           DatabaseName
,           CASE 
                WHEN is_trustworthy_on = 0 
                    THEN 'Completed' 
                ELSE 'Ongoing' 
            END AS Status
FROM        #temp2
6
задан Gabe 16 March 2010 в 17:49
поделиться

5 ответов

Как вы упомянули, принудительное хранение приложения в памяти - не лучший способ совместного использования ресурсов на компьютере. Быстрое решение, которое вам может пригодиться, - это просто запланировать событие, которое будит ваш сервис в определенное время каждое утро, прежде чем ваши клиенты начнут его использовать. Вы можете просто запланировать это в планировщике задач Windows с помощью простого сценария или вызова EXE.

8
ответ дан 9 December 2019 в 20:48
поделиться

Третий подход может состоять в том, чтобы ваша служба запускала поток, который делает что-то тривиальное, например, увеличивает счетчик, а затем спит довольно долго, например, 10 секунд. Тиос должен оказывать минимальное влияние на другие приложения, но по крайней мере некоторые из ваших страниц должны быть доступны.

1
ответ дан 9 December 2019 в 20:48
поделиться

С точки зрения Стоимость, самое дешевое и простое решение, вероятно, просто купить больше оперативной памяти для этого сервера, а затем вы можете полностью отключить файл подкачки. Если вы используете 32-битную Windows, просто купите 4 ГБ оперативной памяти. Тогда все адресное пространство будет обеспечено физической памятью, и файл подкачки ничего не будет делать.

0
ответ дан 9 December 2019 в 20:48
поделиться

Еще нужно убедиться, что ваши данные локализованы.

Другими словами: вам действительно нужны все 300 мегабайт памяти, прежде чем вы сможете что-либо сделать? Можно ли переупорядочить используемые вами структуры данных так, чтобы любой конкретный запрос мог быть удовлетворен всего несколькими мегабайтами?

Например

  • , если ваши 300 МБ кучи памяти содержат данные распознавания лиц.Можно ли организовать данные внутри так, чтобы данные о мужских и женских лицах хранились вместе? Или большие носы отделены от маленьких?

  • если он имеет какую-то логическую структуру, можно ли его отсортировать? чтобы можно было использовать двоичный поиск для пропуска большого количества страниц?

  • Если это собственный механизм базы данных в памяти, можно ли лучше проиндексировать / кластеризовать данные, чтобы не требовалось так много обращений к страницам памяти?

  • ] если это текстуры изображения, могут ли обычно используемые текстуры располагаться рядом друг с другом?

Вам действительно нужны все 300 МБ памяти, прежде чем вы сможете что-либо сделать? Вы не можете обслуживать запрос без всех этих данных обратно в память?


В противном случае: запланированное задание на 6 ᴀᴍ, чтобы разбудить его.

1
ответ дан 9 December 2019 в 20:48
поделиться

Я не утверждаю, что вам нужно делать именно так, или что это лучшая практика, но вы можете обнаружить, что это работает достаточно хорошо для вас. Кажется, это соответствует тому, о чем вы просили.

Резюме: Касайтесь каждой страницы в процессе, по странице за раз, на регулярной основе.

Как насчет потока, который работает в фоновом режиме и просыпается раз в N секунд. Каждый раз, когда страница просыпается, она пытается прочитать с адреса X. Попытка защищена обработчиком исключений на случай, если вы прочитаете плохой адрес. Затем увеличиваем X на размер страницы.

В 4 ГБ 65536 страниц, в 3 ГБ - 49152 страницы, в 2 ГБ - 32768 страниц. Разделите время простоя (ночное мертвое время) на то, как часто вы хотите (пытаетесь) обращаться к каждой странице.

BYTE *ptr;

ptr = NULL;
while(TRUE)
{
    __try
    {
        BYTE b;

        b = *ptr;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        // ignore, some pages won't be accessible
    }

    ptr += sizeofVMPage;

    Sleep(N * 1000);
}

Вы можете получить значение sizeOfVMPage из значения dwPageSize в возвращаемом результате GetSystemInfo().

Не пытайтесь обойти обработчик исключений, используя if (!IsBadReadPtr(ptr)), потому что другие потоки в приложении могут одновременно изменять защиту памяти. Если вы выйдете из строя из-за этого, определить причину будет практически невозможно (скорее всего, это будет неповторяющееся состояние гонки), поэтому не тратьте на это время.

Конечно, вы захотите отключить этот поток в течение дня и запускать его только в мертвое время.

2
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: