Вопрос о виртуальной памяти

User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Вопрос о виртуальной памяти

Post by Dmitry67 »

Если NT не хватает памяти (некоторый процесс активно растет в памяти а другие процессы 'спят') и она решает что надо выгрузить страничку в pagefile,
то

1. Как она выбирает процесс-жертву ?
2. У жертвы как она выбирает страницу ?

Спасибо
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
шпиён
Уже с Приветом
Posts: 3459
Joined: 29 Oct 2002 20:08
Location: US

Post by шпиён »

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngenlib/html/msdn_ntvmm.asp

Managing a Working Set of Pages for Each Process
Another part of the VMM gets pages into the transitional state. The thread that gets transitional pages must continually decide what data is most deserving of replacement on a process-by-process basis. The algorithm for deciding which page to replace is typically based on predicting the page that is least likely to be needed next. This prediction is influenced by factors such as what page was accessed least often and what page was accessed the longest time ago. In Windows NT, the component responsible for making these predictions is called the working-set manager.

When a process starts, the VMM assigns it a default working set that indicates the minimum number of pages necessary for the process to operate efficiently (that is, the least amount of paging possible to fulfill the needs of the process without starving the needs of other processes). The working-set manager periodically tests this quota by stealing Valid pages of memory from a process. If the process continues to execute without generating a page fault for this page, the working set is reduced by one, and the page is made available to the system. This test is performed indiscriminately to all processes in the system, providing the basis for the free pool of pages described above. All processes benefit from this pool by being able to allocate from it on demand.

The act of stealing a page from a process actually occurs in two stages. First, the working-set manager changes the PTE for the page to indicate an invalid page in transition. Second, the working-set manager also updates the page-frame database entry for the physical page, marking it as either Modified or Standby, depending on whether the page is dirty or not.

User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Таким образом в стабильной системе (сервис который работает с неким буфером постоянного очень долго) система будет пытаться это буфер украсть, даже если памяти до хрена ?

Вот к чему это приводит. Есть процесс (SQL server) который выполняет запросы
Он набирает кэш и раздувается в памяти
Потом weekend его никто не трогает
Он сдувается хотя памяти до хрена
Запускаем кверь в поенедьник - timeout от http

Лечится похоже AWE memory, но все равно нехорошо
Нет ли способа пометить процесс как неподчиняющийся этому правилу ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
шпиён
Уже с Приветом
Posts: 3459
Joined: 29 Oct 2002 20:08
Location: US

Post by шпиён »

Dmitry67 wrote:Таким образом в стабильной системе (сервис который работает с неким буфером постоянного очень долго) система будет пытаться это буфер украсть, даже если памяти до хрена ?

Вот к чему это приводит. Есть процесс (SQL server) который выполняет запросы
Он набирает кэш и раздувается в памяти
Потом weekend его никто не трогает
Он сдувается хотя памяти до хрена
Запускаем кверь в поенедьник - timeout от http

Лечится похоже AWE memory, но все равно нехорошо
Нет ли способа пометить процесс как неподчиняющийся этому правилу ?


Программно в рамках Win32 API не трудно пометить страницы как невыгружаемые - VirtualLock. Если разработчики SQL Server этого не сделали по какой опции, то это можно сделать самому, написав extended stored procedure на си.
Как вариант - на сервере уменьшить pagefiles до минимума. Тогда останется только своппинг страниц кода, что выключается опцией в registry:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\DisablePagingExecutive (что всегда, ИМХО, полезно с современными объемами памяти).
User avatar
шпиён
Уже с Приветом
Posts: 3459
Joined: 29 Oct 2002 20:08
Location: US

Post by шпиён »

Кстати, а опция min server memory не помогает что ли?
User avatar
DenisM
Уже с Приветом
Posts: 1976
Joined: 08 Jun 1999 09:01
Location: SPb -> SFBA -> Beaverton, OR

Post by DenisM »

Народ, я тут работу ищу, и вчера мне предложили пройти некий quiz, где, в частности, был вопрос по virtual memory. Я этот quiz успешно прошел, но "мучают смутные сомнения"(С) по поводу правильности ответа на этот вопрос. У кого какие мысли ( желательно с комментарием )?

Вот, собственно, вопрос:
============================================
Consider a virtual memory with M resident pages and a page reference sequence

p1, p2, . . ., pN

of N distinct requests. Assume that physical memory is initially filled with unrelated pages, N = 2M, and a FIFO page replacement algorithm is used. If the access pattern is p1, p2, . . ., pN repeated three times, then the number of page faults is

(A) N/2 (B) N (C) N + 3 (D) 2N (E) 3N
=============================================
User avatar
olg2002
Уже с Приветом
Posts: 990
Joined: 27 Mar 2002 10:01
Location: Palo Alto, CA

Post by olg2002 »

(E) 3N. Каждое новое обращение вызовет page fault. Ответ остается тем же даже если N = M + 1.
User avatar
tengiz
Уже с Приветом
Posts: 4468
Joined: 21 Sep 2000 09:01
Location: Sammamish, WA

Post by tengiz »

шпиён wrote:Программно в рамках Win32 API не трудно пометить страницы как невыгружаемые - VirtualLock.

Это всё не так просто как кажется - во-первых, есть предел на максимальное количество страниц, заблокированных в памяти, который по умолчанию не очень велик; во-вторых, если ОС не в состоянии обеспечить заказанное количество заблокированных страниц, то working set процесса в один прекрасный момент может оказаться полностью выгруженным, причём в ситуации, когда на самом деле обошлось бы выгрузкой нескольких страниц. Так что, к сожалению, простого решения нет.

Для SQL Server в качестве костылей можно, например, вдобавок к обычной для выходных активности (full backup, DBCC REINDEX, DBCC INDEXDEFRAG и пр.) соорудить job для агента, который в случае отсутствия других активных задач периодически делал бы неблокирующие онлайновые операции, скажем, DBCC SHOWCONTIG.
Cheers
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

tengiz wrote:Для SQL Server в качестве костылей можно, например, вдобавок к обычной для выходных активности (full backup, DBCC REINDEX, DBCC INDEXDEFRAG и пр.) соорудить job для агента, который в случае отсутствия других активных задач периодически делал бы неблокирующие онлайновые операции, скажем, DBCC SHOWCONTIG.


Спасибо
Забавно конечно

"Прогрев" SQL server перед работой... Ладно, задумал ряд экспериментов... О результатах доложу...
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
hb
Posts: 14
Joined: 04 Jun 2001 09:01
Location: Pandora's box

Post by hb »

Я прошу прощения за столь наивный вопрос, но чекбокс Reserve physical memory for SQL Server не решает проблемы? Мне казалось, он именно для этого и предназначен.

SQL Server Properties (Memory Tab)
Use this tab to view or specify the following options.

Options
Dynamically configure SQL Server memory

Specify that Microsoft® SQL Server™ memory be configured immediately after you make changes to the server properties.

Use a fixed memory size

Specify a fixed memory size for SQL Server.

Reserve physical memory for SQL Server

Reserve physical memory space for SQL Server equal to the memory setting. This means Microsoft Windows NT® 4.0 or Windows® 2000 does not swap out SQL Server's pages even if the pages can be used more readily when SQL Server is idle.
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Эта опция стоит
Но PageFaults все равно генеряться и данные постепенно выпадают из кэша просто с течением времени
Я провожу несколько экспериментов, напишу резальтаты
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Короче проблема обнаружилась и была совсем не там
При создании теста была залита таблица с 100 MLN записями
Чтобы было быстрее индексы убрали
А потом после заливки создали
Но не все :)
В итоге время от времени проходил (незаметно так как это был из BizTalk) один большой толстый и страшный TABLE SCAN
И он полностью 'выбивал' кэш из под системы.
Кстати жаль что в SQL server нельзя это контролировать (кеши)
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014

Return to “Вопросы и новости IT”