У меня есть Linux-бокс с 8 ГБ ОЗУ, на котором работают 4 сервера tomcat. Один из них установлен на 3000 МБ памяти (настройка jvm -Xms и -Xmx), а другие установлены на 1500 МБ. Раздел подкачки также установлен на 8 ГБ. Когда я запускаю эти серверы, использование файла подкачки мало. Но в течение нескольких дней и в определенное время, когда один или все серверы находятся в пике активности, использование свопа начинает увеличиваться. Вот типичный вывод sar -r.
kbmemfree kbmemused% memused kbbuffers kbcached kbswpfree kbswpused % swpused kbswpcad
48260 8125832 99,41 196440 2761852 7197688 1190912 14.20 316044
75504 8098588 99.08 198032 2399460 7197688 1190912 14.20 316032
Он показывает, что в настоящее время используется своп 14,2%. Самое смешное, что этот% НИКОГДА не уменьшается. Он продолжает расти и достигает 30-40%.. Мы перезагружаем наши серверы еженедельно.
Я бы предположил % swpused увеличиваться в периоды максимальной активности и уменьшаться в периоды низкой активности .. Или, по крайней мере, оставаться постоянным. Похоже, что пространство подкачки никогда не освобождается ОС.
Вывод free: free -m всего используемых свободных общих буферов кэшировано Mem: 7982 7937 45 0 32 2088 - / + buffers / cache: 5816 2166 Swap: 8191 1163 7028
Итак, есть как минимум 2г бесплатного Ram. Возникает вопрос: почему пространство подкачки продолжает увеличиваться и не восстанавливается ОС? Или как отладить это, чтобы выяснить, что происходит ..
Если информация выгружается на диск, а затем считывается обратно в память, она часто остается выделенной в области подкачки до тех пор, пока пространство подкачки не иссякнет. Это означает, что если та же самая информация должна быть заменена снова позже и не изменилась, ОС может просто удалить страницы из выделенной оперативной памяти без необходимости записывать что-либо на диск, экономя время.
Своп, выделенный для материала, который был считан обратно в память, будет освобожден либо
Смотреть в /proc/meminfo
для строки под названием «SwapCached». Эта запись подсчитывает страницы, которые находятся как в ОЗУ, так и в разделах подкачки. Например, при случайном выборе небольшой виртуальной машины /proc/meminfo
виртуальный файл, который показывает одна из моих виртуальных машин:
SwapTotal: 698816 kB
SwapFree: 624520 kB
SwapCached: 17232 kB
Это означает, что выделено 74268 КБ пространства подкачки, но эти страницы на 17232 КБ в настоящее время также отображаются в ОЗУ (поэтому их можно освободить из подкачки в любой момент, если пространство потребуется для чего-то еще).
Также, без сомнения, там будут сидеть страницы, которые были заменены много лет назад и с тех пор больше никогда не использовались. Ядро не будет перезагружать страницы из подкачки только потому, что есть некоторая свободная ОЗУ для чтения обратно, так как эту свободную ОЗУ лучше использовать для кеша или буферов - страницы, записанные в подкачку, обычно перечитываются только тогда, когда они в следующий раз необходимы.
Если вы хотите очистить то, что находится в свопе, если у вас достаточно свободного и / или освобождаемого (т.е. свободного + кеша + буферов (за вычетом тех частей счетчиков c + b, которые не могут быть освобождены RightThisInstant)), просто включите его выключить и снова включить с swapoff -a && swapon -a
.
Конечно, у вас также может быть утечка памяти где-то, но это не единственное объяснение поведения, которое вы наблюдаете.
По сути, вам не нужно об этом заботиться. Важно знать, сколько операций ввода-вывода идет на своп (см. Команду vmstat). Наличие большего количества вещей в свопе ничего не стоит. Единственная стоимость - это поместить материал в своп (страница на входе) или вынуть его (страница на выходе). Таким образом, для ОС есть основания позволить свопу увеличиваться.
до тех пор, пока у вас есть доступное пространство подкачки, ОС не нужно освобождать место подкачки. Он будет освобожден, когда не останется места. Но когда вы попадаете в такую ситуацию, у вас определенно возникает проблема.
Невозможно сказать, станет ли это в конечном итоге проблемой, если вы не запустите сервер достаточно долго, чтобы увидеть, станет ли это проблемой.
Обычно ОС меняет местами вещи, которые не используются, чтобы постоянно оставлять некоторую память свободной в случае запуска новой программы. Пространство подкачки не будет освобождено до тех пор, пока оно не понадобится, что означает, что вы можете использовать 100% пространства подкачки и не иметь проблем с производительностью. Следует беспокоиться, если это вызвано утечкой памяти. Это не обязательно утечка памяти, но может быть.
Java не подвержена утечкам памяти, но это может происходить особенно со сложными приложениями.