Большинство производственных серверов в настоящее время работают под управлением Linux — будь то Debian, Ubuntu или Centos – благодаря универсальности операционной системы и тому факту, что она бесплатна в использовании. Linux обладает широким спектром инструментов для поддержки, управления, мониторинга и развертывания программных приложений.
Сервисы и функции, добавленные в приложение продукта, могут потреблять значительный объем памяти. Оптимизация памяти для серверов Linux не только обеспечивает более плавную и быструю работу приложений, но и снижает риск потери данных и сбоев сервера. В этой статье мы рассмотрим несколько способов оптимизации памяти в Linux.
Чтобы оптимизировать память для машин с Linux, нам сначала нужно понять, как работает память в Linux. Мы начнем с некоторых терминов памяти, обсудим, как Linux обрабатывает память, а затем узнаем, как устранять неполадки с памятью и предотвращать их.
Общий объем памяти, который может содержать одна машина, зависит от архитектуры операционной системы. Например, операционная система с 32-разрядной архитектурой может поддерживать только 4 ГБ памяти, в то время как 64-разрядная может поддерживать около 128 ГБ (теоретически, она может поддерживать до 16 ГБ, если возможности оборудования улучшатся).
Вся память в Linux называется виртуальной памятью — она включает физическую память (часто называемую ОЗУ) и пространство подкачки. Физическая память системы не может быть увеличена, если мы не добавим больше ОЗУ. Однако виртуальную память можно увеличить, используя пространство подкачки с жесткого диска.
Оперативная память определяет, может ли ваша машина обрабатывать процессы, требующие большого объема памяти. Например, нам потребуется не менее 1 ГБ оперативной памяти на 1000 ресурсов, использующих MongoDB на производственном сервере. Чтобы обеспечить удовлетворительную производительность сервера, физическая память должна превышать то, что требуется базе данных — в противном случае MongoDB начнет использовать вместо нее память подкачки, снижая производительность системы. Причина этого заключается в том, что физическая память доступна за наносекунды, но подкачка памяти осуществляется только в течение миллисекунд.
Обычно физическая память обеспечивает хранение данных для всех процессов в компьютере. Но что происходит, когда физическая память заполнена? В игру вступает память подкачки.
Когда система заполнится, неактивные страницы в памяти будут перемещены в память подкачки, состоящую из раздела подкачки, файла подкачки или того и другого. Раздел подкачки – это раздел диска, тогда как файл подкачки – это файловая система. Использование того или другого варианта зависит от предпочтений, поскольку оба они допустимы.
Дисковая память, или память жесткого диска, часто больше физической памяти. Во время вычислений данные для выполняемых в данный момент задач хранятся в оперативной памяти; при отключении питания компьютера эти данные исчезают. Вот почему важно часто сохранять рабочую память — в памяти диска сохраняются постоянные данные.
Ниже приведена блок-схема, демонстрирующая, как обрабатываются данные в Linux.
Данные от пользователя, компьютерных процессов и жесткого диска отправляются в ОЗУ. При необходимости ОЗУ сохранит и отправит их обратно пользователю или жесткому диску. Если данные должны быть постоянными, оперативная память отправит их в центральный процессор.
Для обнаружения проблем с памятью и оптимизации памяти в Linux нам понадобится один из нескольких инструментов.
Аппаратные проблемы могут напрямую влиять на оптимизацию памяти. Предположим, например, что ваш веб-сайт работает медленно, а локальная программа замедлилась до обхода. Чтобы узнать, связано ли это с проблемой оперативной памяти, вам нужно удалить модули оперативной памяти и протестировать их, чтобы определить, какой из них неисправен.
dmidecode может помочь получить информацию об оборудовании системы при проверке на наличие аппаратных проблем. Инструмент dmidecode помогает отобразить BIOS вашего системного управления в содержимом таблицы.
Например, запустите
dmidecode
Здесь будет показана приведенная ниже информация о памяти.
Нехватка свободного места для выполнения задач – одна из наиболее распространенных причин медленной работы компьютера. Чтобы проверить наличие свободного места на вашем компьютере, вы можете воспользоваться командой free.
free -g
Здесь будет показано свободное пространство памяти в ГБ.
Существует множество инструментов командной строки для проверки загрузки процессора и памяти, включая htop, vmstat, и ps.
htop отображает информацию о процессах процессора в режиме реального времени.
vmstat показывает информацию о процессоре, памяти, системных процессах, подкачке, прерываниях и планировании процессора.
Например, запустите
vmstat -a -S M
Здесь будет показана информация о памяти в МБ.
ps предоставляет нам информацию о запущенных процессах в Linux.
Например, ps -aux показывает все запущенные процессы.
Сервер Linux может потреблять значительный объем памяти по разным причинам. Для быстрого и эффективного устранения неполадок сначала нам нужно исключить наиболее вероятные причины.
Существует несколько приложений, реализованных с использованием Java, и их неправильная реализация или конфигурация может привести к высокому использованию памяти на сервере. Две наиболее распространенные причины – неправильная конфигурация кэширования и антишаблон кэширования сеанса.
Кэширование – распространенный способ достижения высокой производительности приложений, но при неправильном применении оно может в конечном итоге снизить производительность системы. Неправильная конфигурация может привести к слишком быстрому росту кэша, оставляя меньше памяти для других процессов, запущенных в системе.
Кэширование сеанса часто используется при сохранении промежуточного состояния приложения. Это позволяет разработчикам сохранять пользователей за сеанс и упрощает сохранение или получение значения объекта данных. Однако разработчики, как правило, забывают очистить данные кэширования сеанса после этого.
При работе с базами данных в Java сеанс гибернации обычно используется для создания соединений и управления сеансом между сервером и базой данных. Но есть ошибка, которая часто возникает, когда разработчики работают с сеансами гибернации. Сеанс гибернации не изолирован в целях потокобезопасности, а включен в тот же HTTP-сеанс. Это заставляет приложение хранить больше состояний, чем необходимо, и при наличии всего нескольких пользователей использование памяти значительно увеличивается.
При обсуждении процессов, потребляющих большое количество памяти, мы должны упомянуть базы данных. При большом количестве операций чтения и записи в базу данных, пока приложение обрабатывает запросы пользователей, наша база данных может потреблять значительный объем памяти.
Возьмем за основу базу данных MySQL: для достижения высокой производительности в ней применяется механизм буферизации для кэширования и индексации данных. Если мы настроим базу данных на максимальное использование памяти при нескольких запросах к базе данных, память на нашем сервере Linux вскоре будет перегружена.
При использовании Amazon EC2 следует обращать внимание на конфигурацию компьютера. Поступали сообщения о вредоносном ПО, использующем уязвимые экземпляры Amazon EC2 для криптомайнинга. Когда это происходит, мы часто наблюдаем значительный всплеск использования памяти и зависание системы.
Избыточная загрузка памяти – это термин, используемый для описания того, что происходит, когда мы разрешаем приложению использовать больше виртуальной памяти, чем может обслуживать физическая память. С одной стороны, это помогает системе избежать недоиспользования оперативной памяти. С другой стороны, если системе разрешить продолжать бесконтрольно выделять виртуальную память программам, произойдет сбой, когда физической памяти не останется.
Оптимизация памяти в Linux – сложная задача, и исправление перегруженной памяти требует значительных усилий. Вот несколько рекомендаций, которые могут помочь предотвратить возникновение проблем с памятью.
Создайте раздел подкачки на своем сервере; его можно использовать как виртуальную память для вашего сервера. В наихудшем сценарии, когда физическая память заполнена, память, принадлежащая неактивным процессам, будет перемещена в пространство подкачки, позволяя продолжать работу жизненно важным активным процессам, которым требуется память.
Оперативный диск используется для кэширования приложений или рабочих областей. Это энергозависимое хранилище, определенное в пределах оперативной памяти. Использование ramdisk повышает производительность обработки файлов: по сравнению с твердотельными накопителями (SSD) ramdisk работает более чем в 50 раз быстрее. Создание ramdisk полезно, когда у вас есть сервер приложений, для запуска которого требуется значительное количество аппаратных ресурсов.
Чтобы свести к минимуму риск взлома, открывайте только те порты, которые вам нужны в данный момент времени. Кроме того, ограничьте доступ к портам через виртуальную частную сеть.
Если вы столкнулись с вредоносной атакой, такой как попытка криптомайнинга, дважды проверьте как входящие— так и исходящие порты – и, опять же, открывайте только те порты, которые вам нужны. Далее вам необходимо удалить crontab из ваших инстансов, поскольку вредоносная программа создала crontab для запуска заданий майнинга.
Для экономии памяти остановите неиспользуемые службы или контейнеры. Например, при развертывании приложений в среде контроля качества или разработки с помощью Docker вы можете создать образ Docker, том и запустить контейнер Docker для тестирования. Их можно очистить после завершения тестирования.
Оптимизация памяти для вашего устройства Linux сэкономит ценную память от хранения данных в ненужных процессах или кэширования неиспользуемых данных. Ваши приложения будут работать более плавно, что снизит риск потери данных или сбоя сервера. Это, в свою очередь, может избавить всю команду от значительных разочарований, не говоря уже о времени и деньгах.