предисловие
Недавно я столкнулся с онлайн-сбоем, связанным с дисками, чтобы обобщить знания, связанные с кэшированием дисков в Linux, о которых я раньше ничего не знал.
В целом причин появления дискового кеша две: первая заключается в том, что скорость обращения к диску намного медленнее скорости обращения к памяти, а скорость доступа можно улучшить за счет кэширования содержимого диска в памяти; второй основан на принципе локальности программы: как только доступ к данным будет осуществлен, к ним, скорее всего, снова будут обращаться через короткий промежуток времени, поэтому кэширование содержимого диска в памяти может повысить скорость работы программы. программа.
принцип локальности
Принцип локальности программы: программа проявляет закон локальности при выполнении, то есть выполнение всей программы ограничивается определенной частью программы в течение определенного периода времени. Соответственно, пространство памяти, к которому обращается выполнение, также ограничено определенной областью памяти.В частности, локальность обычно имеет две формы: временная локальность и пространственная локальность.
Временная локализация: ячейка памяти, на которую ссылаются один раз, будет неоднократно упоминаться в будущем.
Пространственная локализация: если упоминается место в памяти, то будущие местоположения рядом с ним также будут упоминаться.
кеш страницы
Чтобы уменьшить операцию ввода-вывода на диске, система Linux будет кэшировать содержимое открытого диска, а место кэширования — это физическая память, а затем преобразовывать доступ к диску в доступ к памяти, что эффективно повышает скорость. программы. Метод кэширования Linux заключается в использовании физической памяти для кэширования содержимого диска, называемого кэшем страниц (кешем страниц).
Кэш страниц состоит из физических страниц в памяти, содержимое которых соответствует физическим блокам на диске. Размер кэша страниц будет динамически регулироваться в соответствии с объемом свободной памяти системы.Он может увеличивать размер, занимая память, или уменьшаться, чтобы уменьшить нагрузку на память.
До появления механизма виртуальной памяти операционная система использовала последовательность блочного кеша, но после появления виртуальной памяти операционная система управляет вводом-выводом с большей степенью детализации, поэтому принимается механизм кеша страниц, основанный на страницах. , файлово-ориентированный механизм кэширования.
кеш страниц чтение
Когда система Linux читает файл, она предпочтительно считывает содержимое файла из кеша страниц.Если кеша страниц не существует, система сначала читает содержимое файла с диска и обновляет его до кеша страниц, а затем читает файл из кеша страницы.content и return. Общий процесс выглядит следующим образом:
- Процесс вызывает библиотечную функцию чтения, чтобы инициировать запрос на чтение файла.
- Ядро проверяет список открытых файлов и вызывает интерфейс чтения, предоставляемый файловой системой.
- Найдите индексный дескриптор, соответствующий файлу, а затем вычислите конкретную страницу для чтения.
- Найдите соответствующий кеш страницы через индексный дескриптор, 1) если попадет узел кеша страницы, содержимое файла будет возвращено напрямую; 2) если нет соответствующего кеша страницы, будет сгенерирована ошибка страницы. В этот момент система создаст новый пустой кеш страниц и прочитает содержимое файла с диска, обновит кеш страниц и повторит шаг 4.
- чтение файла возврат
Таким образом, все содержимое файла считывается, независимо от того, было ли изначально обращено к кэшу страницы или нет, в конечном итоге происходит непосредственно из кэша страницы.
кеш страницы пишет
Из-за существования кэша страниц, когда процесс вызывает запись, обновление файла записывается только в кэш страниц файла, а затем соответствующая страница помечается как грязная, и весь процесс завершается. Ядро Linux периодически записывает грязные страницы обратно на диск, а затем сбрасывает грязный флаг.
Поскольку операция записи только записывает изменения в кэш страниц, процесс не блокируется до тех пор, пока не произойдет дисковый ввод-вывод.Если компьютер выйдет из строя в это время, изменения операции записи могут не произойти на диске. Поэтому для некоторых операций записи со строгими требованиями, таких как системы данных, необходимо активно вызывать fsync и другие операции для синхронизации изменений на диске во времени. Операция чтения отличается.Чтение обычно блокируется до тех пор, пока процесс не прочитает данные.Чтобы уменьшить эту задержку в операции чтения,система Linux по-прежнему использует технологию "упреждающего чтения",то есть при чтении данных с диска, ядро будет считывать больше страниц в кеш страниц.
поток обратной записи
Обратная запись кэша страниц выполняется отдельным потоком в ядре.Поток обратной записи будет выполнять обратную запись в следующих трех ситуациях:
- Когда свободная память ниже порога. Когда свободной памяти недостаточно, часть кеша необходимо освободить.Поскольку освобождать можно только страницы, которые не являются грязными, все грязные страницы необходимо записать обратно на диск, чтобы сделать их пригодными для повторного использования чистыми страницами.
- Когда грязные страницы обрабатываются в памяти дольше порогового значения. Это делается для того, чтобы грязные страницы не оставались в памяти на неопределенный срок, что снижает риск потери данных.
- Когда пользовательский процесс вызывает системные вызовы sync и fsync. Это должно предоставить пользовательскому процессу метод принудительной обратной записи для соответствия сценариям использования со строгими требованиями к обратной записи.
Реализация потока обратной записи
название | Версия | инструкция |
---|---|---|
bdflush | До версии 2.6 | Поток ядра bdflush работает в фоновом режиме, а в системе существует только один поток bdflush.Когда потребление памяти падает ниже определенного порога, поток bdflush пробуждается. kupdated запускается периодически, возвращая грязные страницы. Однако во всей системе существует только один поток bdflush.Когда системная задача обратной записи тяжелая, поток bdflush может блокировать ввод-вывод определенного диска, что приводит к операции обратной записи ввода-вывода других дисков. не выполняется вовремя. |
pdflush | Представлено в версии 2.6 | Количество потоков pdflush является динамическим и зависит от нагрузки ввода-вывода системы. Это глобальная задача для всех дисков в системе. Однако, поскольку pdflush предназначен для всех дисков, возможно, что несколько потоков pdflush заблокированы на перегруженном диске, что также приводит к тому, что обратная запись ввода-вывода на другие диски не выполняется вовремя. |
промывочная нить | Введено после версии 2.6.32 | Количество потоков флешера не уникально, и потоки флешера не для всех дисков, но каждый поток флешера соответствует диску |
Переработка кэша страниц
Логика замены кэша страниц в Linux представляет собой модифицированную реализацию LRU, также известную как стратегия двойной цепочки. В отличие от предыдущего, Linux больше не поддерживает связанный список LRU, а поддерживает два связанных списка: активный связанный список и неактивный связанный список. Страницы в активном списке считаются «горячими» и не будут заменены, а страницы в неактивном списке могут быть заменены. Страница в активном списке должна быть в неактивном списке при доступе к ней. Оба связанных списка поддерживаются псевдо-LRU-правилами: страницы добавляются из хвоста и удаляются из головы, как очередь. Два связанных списка должны быть сбалансированы — если активный связанный список становится слишком большим, чтобы превышать неактивный связанный список, главная страница активного связанного списка будет перемещена обратно в неактивный связанный список, и ее можно будет повторно использовать. Стратегия двойного связанного списка решает дилемму только одного доступа в традиционном алгоритме LRU. Он также упрощает реализацию семантики псевдо-LRU. Этот подход с двусвязным списком также известен как LRU/2. Более распространенным является n-связный список, так называемый LRU/n.
Суммировать
В онлайн-сбое, возникшем на этот раз, основная причина заключается в том, что временный файл используется в качестве кеша в бизнес-логике.Если временный файл создается и удаляется за короткое время, операции с этим файлом в это время находятся в состоянии кеш страниц выполняется без фактической обратной записи на диск. Если в программе возникла проблема и реакция на нее медленная, время существования временного файла увеличивается, и он может быть записан обратно на диск, что приводит к чрезмерному давлению на диск и влияет на всю систему.