- Управление памятью в Linux
- Cached
- dentry/inode caches
- Buffer Cache
- Отображение памяти в команде top: VIRT, RES и SHR
- Подкачка памяти — swap
- Кэширование памяти swap (Swap Cach)
- Подкачка памяти
- Заключение
- What do the «buff/cache» and «avail mem» fields in top mean?
- 3 Answers 3
- В чем разница между буфером и кэш-памятью в Linux?
- 10 ответов:
Управление памятью в Linux
Я думаю, что обычно у каждого пользователя Linux рано или поздно возникает следующий вопрос, задаваемый при администрировании рабочей станции или сервера — «Почему в Linux используется вся моя оперативная память, хотя никакой большой работы не выполняется? «. К нему сегодня я добавлю еще один вопрос, который, я уверен, обычен для многих системных администраторов Linux — «Почему команда free показывает память swap и почему у меня так много свободной оперативной памяти?», так что сегодняшнее мое исследование SwapCached, которое я представляю вам, может оказаться полезным, либо, по крайней мере, ознакомит, как я надеюсь, с информацией об управлении памятью в системе Linux.
В Linux применяется следующее основное правило: неиспользуемая страница оперативной памяти считается потерянной памятью. Оперативная память тратится не только для данных, используемых прикладными приложениями. В ней также хранятся данные для самого ядра и, самое главное, в эту память могут отображаться данные, хранящиеся на жестком диске, что используется для супер-быстрого к ним доступа — команда top указывает об этом в столбцах «buffers/cache» («буферы / кэш»), «disk cache» («дисковый кэш)» или «cached» («кэшировано»). Кэшированная память по сути свободна, поскольку ее можно быстро освободить в случае, если работающей (или только что запущенной) программе потребуется память.
Сохранение кэша означает, что если кому-нибудь еще раз потребуются те же самые данные, то есть большая вероятность, что они все еще будут находиться в кэше в оперативной памяти.
Поэтому первое, чем можно воспользоваться в вашей системе, это команда free , которая предоставит вам первоначальную информацию о том, как используется ваша оперативная память.
Ниже приведены данные, выдаваемые на моем старом ноутбуке с системой Xubuntu:
В строке -/+ buffers/cache показывается, сколько памяти используется и сколько памяти свободно с точки зрения ее использования в приложениях. В этом примере приложениями уже используется 972 Мб памяти и еще 534 МБ памяти могут быть использованы.
Вообще говоря, если используется хотя бы немного памяти подкачки swap, то использование памяти вообще не повлияет на производительность системы.
Но если вы хотите получить более подробную информацию о вашей памяти, то вы должны проверить файл /proc/meminfo; в моей системе Xubuntu с ядром 3.2.0-25-generic результат будет следующим:
Что означает MemTotal (Всего памяти) и MemFree (Свободная память), понятно для всех; остальные значения поясняются дальше:
Cached
Страничный кэш в системе Linux («Cached:» в meminfo) является в большинстве систем самым крупным потребителем памяти. Каждый раз, когда вы выполняете операцию чтения read () из файла, расположенного на диске, данные считываются в память и помещаются в страничный кэш. После того, как операция read() завершается, ядро может просто выбросить страницу памяти, так как она не используется. Однако, если вы второй раз выполняете операцию чтения той же самой части файла, данные будут считываться непосредственно из памяти и обращения к диску не будет. Это невероятно ускоряет работу и, поэтому, в Linux так интенсивно используется кэширование страниц: ставка делается на то, что если вы обратились к некоторой странице дисковой памяти, то вскоре вы обратитесь к ней снова.
dentry/inode caches
Каждый раз, когда вы в файловой системе выполняете операцию «ls’» (или любую другую операцию: open(), stat() и т.д.), ядру требуются данные, которые находятся на диске. Ядро анализирует эти данные, находящиеся на диске, и помещает его в некоторых структуры данных, независимые от файловой системы, с тем, чтобы они могли в различных файловых системах обрабатываться одним и тем же образом. Таким же самым образом, как кэширование страниц в приведенных выше примерах, ядро может после того, как будет завершена команда «ls», стереть эти структуры. Тем не менее, делается такое же предположение, как и раньше: если вы однажды считали эти данные, вы обязательно прочитаете их еще раз. Ядро хранит эту информацию в нескольких местах «кэша», которые называются кэш памятью dentry и inode. Кэш память dentries являются общей для всех файловых систем, но каждая файловая система имеет свой собственный кэш inodes.
Эта оперативная память является в meminfo составной частью «Slab:»
Вы можете просмотреть различную кэш память и узнать ее размеры с помощью следующей команды:
Buffer Cache
Кэш буфера («Buffers:» в meminfo) является близким родственником кэш памяти dentry/inode. Данные dentries и inodes, размещаемые в памяти, представляют собой описание структур на диске, но располагаются они по-разному. Это, возможно, связано с тем, что у нас в копии, расположенной в памяти, используется такая структура, как указатель, но на диске ее нет. Может также случиться, что на диске байты будут располагаться не в том порядке, как это нужно процессору.
Отображение памяти в команде top: VIRT, RES и SHR
Если вы запускаете команду top , то три строки будут описывать к использованию памяти. Вы должны понимать их значение с тем, чтобы понять, сколько памяти требуется вашему серверу.
VIRT является сокращением от virtual size of a process (виртуальный размер процесса) и представляет собой общий объем используемой памяти: памяти, отображаемой самой в себя (например, памяти видеокарты для сервера X), файлов на диске, которые отображаются в память (особенно это касается разделяемых библиотек) и памяти, разделяемой совместно с другими процессами. Значение VIRT указывает, сколько памяти в настоящий момент доступно программе.
RES является сокращением от resident size (размер резидентной части) и является точным указателем того, сколько в действительности потребляется процессом реальной физической памяти. (Что также соответствует значению, находящемуся непосредственно в колонке %MEM). Это значение практически всегда меньше, чем размер VIRT, т.к. большинство программ зависит от библиотеки C.
SHR показывает, какая величина от значения VIRT является в действительности разделяемой (по памяти или за счет использования библиотек). В случае библиотек, это не обязательно означает, что вся библиотека находится в резидентной памяти. Например, если программа использует только несколько функций библиотеки, то при отображении в память будет использована вся библиотека, что будет учтено в значениях VIRT и SHR, но, на самом деле, будет загружена часть библиотеки, содержащая используемые функции, и это будет учтено в значении RES.
Подкачка памяти — swap
Теперь мы видим некоторую информацию о нашей оперативной памяти, но что происходит, когда больше нет свободной оперативной памяти? Если у меня нет свободной памяти, а мне нужна память для страничного кэширования, кэширования inode или кэширования dentry, то где я ее могу получить?
Прежде всего, ядро пытается не допустить, чтобы у вас значение свободной оперативной памяти приближалось к 0 байтов. Это связано с тем, что когда нужно освободить оперативную память, то обычно требуется выделить немного больше памяти. Это обусловлено тем, что нашему ядру требуется своего рода «рабочее пространство» для выполнения своих действий, и поэтому, если размер свободной оперативной памяти становится равным нулю, ядро ничего больше сделать не сможет.
На основании общего объема оперативной памяти и соотношения ее различных типов (память high/low), ядро эвристически определяет то количество памяти в качестве рабочего пространства, при котором оно чувствует себя комфортно. Когда эта величина достигается, ядро начинает возвращать память для других различных задач, описанных выше. Ядро может вернуть себе память из любой из этих задач.
Однако, есть другой потребитель памяти, о котором мы, возможно, уже забыли: данные пользовательских приложений.
Как только ядро принимает решение, что ему не требуется получать память из каких-либо других источников, которые мы описывали ранее, оно запускает память подкачки swap. В ходе этого процесса оно получает данные пользовательских приложений и записывает их в специальное место (или места) на диске. Обратите внимание, что это происходит не только тогда, когда оперативная память близка к заполнению, ядро может принять решение перенести в память swap также данные, находящиеся в оперативной памяти, если они некоторое время не использовались (смотрите раздел «Подкачка памяти»).
По этой причине, даже система с огромным количеством оперативной памяти (даже если ее правильно настроить) может использовать память подкачки swap. Есть много страниц памяти, в которых находятся данные пользовательских приложений, но эти страницы используются редко. Все это является причиной, чтобы перенести их в раздел swap и использовать оперативную память для других целей.
Вы можете с помощью команды free проверить, используется ли память swap; для примера, который я уже использовал выше, в последней строке выдаваемых данных показывается информация о размере памяти swap:
Мы видим, что на этом компьютере уже используется 24 мегабайта памяти swap и для использования доступно еще 462 Мб.
Таким образом, сам факт использования памяти swap не является доказательством того, что в системе при ее текущей рабочей нагрузке слишком мало оперативной памяти. Лучший способ это определить с помощью команды vmstat — если вы увидите, что много страниц памяти swap перемещаются на диск и обратно, то это означает, что память swap используется активно, что система «пробуксовывает» или что ей нужна новая оперативная память поскольку это ускорит подкачку данных приложений.
На моем ноутбуке Gentoo, когда он простаивает, это выглядит следующим образом:
Обратите внимание на то, что в выходных данных команды free у вас есть только 2 значения, относящихся к памяти swap: free (свободная память) и used (используемая память), но для памяти подкачки swap также есть еще одно важное значение: Swap cache (показатель кэширования памяти подкачки).
Кэширование памяти swap (Swap Cach)
Кеширование памяти swap по сути очень похоже на страничное кеширование. Страница данных пользовательского приложения, записываемая на диск, очень похожа на страницу данных файла, находящуюся на диске. Каждый раз, когда страница считывается из файла подкачки («si» в vmstat), она помещается в кэш подкачки. Так же, как страничное кэширование, все это выполняется ядром. Ядро решает, нужно ли вернуть обратно на диск конкретную страницу. Если в этом возникнет необходимость, то можно проверить, есть ли копия этой страницы на диске и можно просто выбросить страницу из памяти. Это избавит нас от затрат на переписывание страницы на диск.
Кэширование памяти swap действительно полезно только когда мы читаем данные из памяти swap и никогда в нее не делаем записи. Если мы выполняем запись на страницу, то копия на диске не будет соответствовать копии, находящейся в памяти. Если это случится, то мы должны произвести запись страницы на диск точно также, как мы делали это первый раз. Несмотря на то, что затраты на сохранение всей страницы больше, чем затраты на запись небольшого измененного кусочка, система будет работать лучше.
Поэтому, чтобы узнать, что память swap действительно используется, мы должны из значения SwapUsed вычесть значение SwapCached, вы можете найти эту информацию в /proc/meminfo.
Подкачка памяти
Когда приложению нужна память, а вся оперативная память полностью занята, то в распоряжении ядра есть два способа освободить память: оно может либо уменьшить размер дискового кэша в оперативной памяти, убирая устаревшие данные, либо оно может сбросить на диск в swap раздел несколько достаточно редко используемых порций (страниц) программы. Трудно предсказать, какой из способов будет более эффективным. Ядро, исходя из недавней истории действий в системе, делает попытку приблизительно отгадать на данный момент эффективность каждого из этих двух методов.
До ядер версии 2.6 у пользователя не было возможности влиять на эти оценки, так что могла возникнуть ситуации, когда ядро часто делало неправильный выбор, что приводило к пробуксовыванию и низкой производительности. В версии 2.6 ситуация с подкачкой памяти была изменена.
Подкачке памяти назначается значение от 0 до 100, которое изменяет баланс между подкачкой памяти приложений и освобождением кэш памяти. При значении 100 ядро всегда предпочтет найти неактивные страницы и сбросить их на диск в раздел swap; в других случаях этот сброс будет осуществляться в зависимости от того, сколько памяти занимает приложение и насколько трудно выпонять кэширование при поиске и удалении неактивных элементов.
По умолчанию для этого устанавливается значение 60. Значение 0 дает нечто близкое к старому поведению, когда приложения, которым нужна память, заставляли немного уменьшить размер кэша оперативной памяти. Для ноутбуков, для которых предпочтительно иметь диски с меньшей скоростью вращения, рекомендуется использовать значение 20 или меньше.
Заключение
В этой статье я поместил информацию, которая была мне полезной в моей работе в качестве системного администратора, и я надеюсь, что она может оказаться полезной и для вас.
Источник
What do the «buff/cache» and «avail mem» fields in top mean?
Within the output of top, there are two fields, marked «buff/cache» and «avail Mem» in the memory and swap usage lines:
What do these two fields mean?
I’ve tried Googling them, but the results only bring up generic articles on top, and they don’t explain what these fields signify.
3 Answers 3
top ’s manpage doesn’t describe the fields, but free ’s does:
Memory used by kernel buffers ( Buffers in /proc/meminfo )
cache
Memory used by the page cache and slabs ( Cached and SReclaimable in /proc/meminfo )
buff/cache
Sum of buffers and cache
available
Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use ( MemAvailable in /proc/meminfo , available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free)
Basically, “buff/cache” counts memory used for data that’s on disk or should end up there soon, and as a result is potentially usable (the corresponding memory can be made available immediately, if it hasn’t been modified since it was read, or given enough time, if it has); “available” measures the amount of memory which can be allocated and used without causing more swapping (see How can I get the amount of available memory portably across distributions? for a lot more detail on that).
Источник
В чем разница между буфером и кэш-памятью в Linux?
мне не ясно, в чем разница между двумя концепциями памяти Linux : buffer и cache . Я прочитал этот пост и мне кажется, что разница между ними-это политика действия:
- политика буфера-первый вход, первый выход
- политика кэша используется меньше всего в последнее время.
в частности, я смотрю на две команды: free и vmstat
10 ответов:
«буфера» представляю, сколько часть оперативной памяти выделяется для кэширования дисковых блоков. «Кэшированный «похож на» буферы», только на этот раз он кэширует страницы из чтения файлов.
буферы связаны с конкретным блочным устройством и кэшированием обложки метаданных файловой системы, а также отслеживания страниц в полете. Тайник содержит только припаркованные данные файла. То есть буферы помнят, что такое в каталогах, какие права доступа к файлам, и отслеживать, что память записывается или считывается для конкретного блочного устройства. Кэш содержит только содержимое самих файлов.
короткий ответ: кэширование-это размер кэша страницы. Буферы-это размер буферов ввода/вывода блока памяти. Кэшированные вопросы; буферы в значительной степени не имеют значения.
Long answer: Cached-это размер кэша страниц Linux, минус память в кэше подкачки, которая представлена SwapCached (таким образом, общий размер кэша страниц кэшируется + SwapCached). Linux выполняет все операции ввода-вывода файлов через кэш страниц. Записи реализуются как простая маркировка как грязные соответствующие страницы в кэше страниц; потоки flusher затем периодически записывают на диск любые грязные страницы. Чтение осуществляется путем возврата данных из кэша страниц; если данные еще не находятся в кэше, они сначала заполняются. В современной системе Linux кэширование может легко составлять несколько гигабайт. Он будет сжиматься только в ответ на давление памяти. Система очистит кэш страницы вместе с заменой данных на диск, чтобы сделать доступно больше памяти по мере необходимости.
буферы-это буферы ввода/вывода блока памяти. Они относительно недолговечны. До версии ядра Linux 2.4, Linux имел отдельные страницы и буферные кэши. Начиная с 2.4, страница и буферный кэш унифицированы, а буферы-это необработанные дисковые блоки, не представленные в кэше страниц, т. е. не файловые данные. Таким образом, метрика буферов имеет минимальное значение. В большинстве систем буферы часто составляют всего лишь десятки мегабайт.
Это не совсем так просто, как это, но это может помочь понять:
буфер предназначен для хранения метаданных файла (разрешения, местоположение и т. д.). Здесь отслеживается каждая страница памяти.
кэш предназначен для хранения фактического содержимого файла.
буфер-это то, что еще предстоит «записать» на диск.
кэш-это то, что было» прочитано » с диска и сохранено для последующего использования.
Я думаю, что эта страница поможет понять разницу между буфером и глубоко кэш. http://www.tldp.org/LDP/sag/html/buffer-cache.html
чтение с диска происходит очень медленно по сравнению с доступом к (реальной) памяти. Кроме того, обычно одна и та же часть диска считывается несколько раз в течение относительно коротких периодов времени. Например, можно сначала прочитать сообщение электронной почты, а затем прочитать письмо в редакторе при ответе на него, а затем сделать Почту программа читает его снова при копировании в папку. Или, подумайте, как часто команда ls может быть запущен на системе с большим количеством пользователей. Считывая информацию с диска только один раз, а затем сохраняя ее в памяти до тех пор, пока она больше не понадобится, можно ускорить все, кроме первого чтения. Это называется буферизацией диска, а память, используемая для этой цели, называется буферным кэшем.
поскольку память, к сожалению, является конечным, нет, дефицитным ресурсом, буферный кэш обычно не может быть большим достаточно (он не может содержать все данные, которые когда-либо хотел использовать). Когда кэш заполняется, данные, которые не использовались в течение длительного времени, отбрасываются и освобожденная таким образом память используется для новых данных.
буферизация диска работает и для записи. С одной стороны, записанные данные часто вскоре считываются снова (например, файл исходного кода сохраняется в файл, а затем читается компилятором), поэтому размещение данных, записанных в кэш, является хорошей идеей. С другой стороны, только положив данные в кэш, не записывая его на диск сразу, программа, которая пишет работает быстрее. Запись может быть выполнена в фоновом режиме, без замедления других программ.
Кэширует Страницы:
кэш-это часть памяти, которая прозрачно хранит данные, чтобы будущие запросы на эти данные могли обслуживаться быстрее. Эта память используется ядром для кэширования дисковых данных и повышения производительности ввода-вывода.
ядро Linux построено таким образом, что оно будет использовать как можно больше оперативной памяти для кэширования информации с локальных и удаленных файловых систем и дисков. Как время проходит над различными считывания и записи выполняются в системе, ядро пытается сохранить данные, хранящиеся в памяти для различных процессов, которые выполняются в системе или данных соответствующих процессов, которые будут использоваться в ближайшем будущем. Кэш не восстанавливается в то время, когда процесс получает остановку/выход, однако когда другие процессы требуют больше памяти, чем свободная доступная память, ядро будет запускать эвристику для восстановления памяти путем хранения данных кэша и выделения эту память для нового процесса.
когда запрашивается какой-либо файл/данные, ядро будет искать копию той части файла, над которой работает пользователь, и, если такой копии не существует, оно выделит одну новую страницу кэш-памяти и заполнит ее соответствующим содержимым, считанным с диска.
данные, хранящиеся в кэше, могут быть значениями, вычисленными ранее, или дубликатами исходных значений, хранящихся в другом месте диска. Когда некоторые данные запрашиваются, кэш сначала проверяется, содержит ли он эти данные. Данные могут быть извлечены из кэша быстрее, чем из его исходного источника.
сегменты общей памяти SysV также учитываются как кэш, хотя они не представляют никаких данных на дисках. Можно проверить размер сегментов общей памяти с помощью команды ipcs-m и проверки столбца bytes.
буфера :
буферы-это дисковый блок представление данных, которые хранятся в кэше страниц. Буферы содержат метаданные файлов / данных, которые находятся в кэше страниц. Пример: когда есть запрос каких-либо данных, которые присутствуют в кэше страниц, сначала ядро проверяет данные в буферах, которые содержат метаданные, которые указывают на фактические файлы/данные, содержащиеся в кэшах страниц. После того, как из метаданных известен фактический адрес блока файла, он берется ядром для обработки.
ссылка сета Робертсона 2 сказала: «Для полного понимания этих терминов обратитесь к книге ядра Linux, такой как разработка ядра Linux Робертом М. любовью.»
Я нашел некоторое содержание о «буфере» во 2-м издании книги.
хотя само физическое устройство для адресации на уровне сектора, ядро выполняет все дисковые операции в терминах блоков.
Если блок хранится в памяти (скажем, после чтения или в ожидании write), он хранится в «буфере». Каждый «буфер» связан ровно с одним блоком. «Буфер» служит объектом, представляющим дисковый блок в памяти.
«буфер» — это представление в памяти одного физического дискового блока.
операции ввода-вывода блока управляют одним дисковым блоком за раз. Общей операцией ввода-вывода блока является чтение и запись inodes. Ядро предоставляет функцию bread() для выполнения низкоуровневого чтения одного блока из диск. Через «буферы» дисковые блоки сопоставляются со связанными с ними страницами в памяти. «
буфер содержит метаданные, которые помогают повысить производительность записи
кэш содержит само содержимое файла (иногда еще для записи на диск), что повышает производительность чтения
буфер-это область памяти, используемая для временного хранения данных во время перемещения из одного места в другое в пределах компьютера.в то время как кэш-это временная область хранения, где часто используемые данные могут храниться для быстрого доступа. После того, как данные будут сохранены в кэше, в будущем можно использовать доступ к кэшированной копии, а не повторную выборку исходных данных, так что среднее время доступа будет короче.
Источник