Active: Memory that has been used more recently and usually not reclaimed unless
absolutely necessary.
Inactive: Memory which has been less recently used. It is more eligible to be
reclaimed for other purposes
Committed_AS: The amount of memory presently allocated on the system. The committed
memory is a sum of all of the memory which has been allocated by
processes, even if it has not been "used" by them as of yet. (...)
Мой вопрос касается памяти Committed_AS и ее части, которая фактически используется/не используется. Я понимаю, что активная память — это часть выделенной памяти, которая фактически используется. Однако я не знаю, что происходит с неактивной памятью; включает ли она также выделенную, но неиспользуемую память, помимо памяти, которая недавно не использовалась?
решение1
Неактивная память — это память, которую процесс использовал в какой-то момент и которая все еще выделена, но которая не использовалась в последнее время. Это память, которая, скорее всего, будет выгружена, чтобы освободить место для новых требуемых блоков.
Выделенная память — это сумма всего пространства, которое номинально было выделено процессам. Это совокупность всего пространства памяти, которое процессы считают доступным, включая активное (в ОЗУ и недавно использованное), неактивное (в ОЗУ и использованное в какой-то момент, но подлежащее подкачке, поскольку его использование не было недавним), выгруженное (когда-то в ОЗУ и использованное, с тех пор выгруженное для подкачки) и никогда не использованное (пространство, возвращенное malloc(), но еще не использованное)
решение2
См. man proc
; цитирую напрямую:
Процесс, который выделяет 1 ГБ памяти (используя malloc(3) или подобный), но затрагивает только 300 МБ этой памяти, будет отображаться как использующий только 300 МБ памяти, даже если у него есть адресное пространство, выделенное для всего 1 ГБ. Этот 1 ГБ — это память, которая была «зарезервирована» виртуальной машиной и может быть использована в любое время выделяющим приложением.
Committed_AS
относится к общему объему памяти, запрошенной в системе для динамического выделения памяти; это означало бы, что неактивная память (которая не находится в куче) не учитывается. Вот где проявляется сила виртуальной памяти; процесс «думает», что у него есть вся запрошенная им память, но на самом деле у него есть только то, что ему нужно.
Это также напрямую связано сovercommit_memory
sysctl
параметр конфигурации, который можно использовать для предотвращения «чрезмерного выделения» памяти, чтобы сервер неООМсебя, если ему когда-либо понадобится вся «выделенная» память сразу.