Конфликт при захвате блокировки и масштабируемость

Конфликт при захвате блокировки и масштабируемость

Термин "конфликт при захвате блокировки" (lock contention, или просто contention) используется для описания блокировки, которая в данный момент захвачена и на освобождение которой ожидают другие потоки. Блокировки с высоким уровнем конфликтов (highly contended) — это те, на освобождение которых всегда ожидает много потоков. Так как задача блокировок — это сериализация доступа к ресурсу, то не вызовет большого удивления тот факт, что блокировки снижают производительность системы. Блокировка с высоким уровнем конфликтов может стать узким местом в системе, быстро уменьшая производительность. Конечно, блокировки необходимы для того, чтобы предотвратить "развал" системы, поэтому решение проблемы высокого уровня конфликтов при блокировках также должно обеспечивать необходимую защиту от состояний конкуренции за ресурсы.

Масштабируемость (scalability) — это мера того, насколько система может быть расширена. В случае операционных систем, когда говорят о масштабируемости, подразумевают большее количество процессов, большее количество процессоров, больший объем памяти. О маштабируемости можно говорить в приложении практически к любому компоненту компьютера, который можно охарактеризовать количественным параметром. В идеале удвоение количества процессоров должно приводить к удвоению процессорной производительности системы. Однако на практике, конечно, такого не бывает никогда.

Масштабируемость операционной системы Linux на большее количество процессоров возросла поразительным образом с того времени, когда поддержка многопроцессорной обработки была встроена в ядра серии 2.0. В те дни, когда поддержка многопроцессорности в операционной системе Linux только появилась, лишь одно задание могло выполняться в режиме ядра в любой момент времени. В ядрах серии 2.2 это ограничение было снято, так как механизмы блокировок стали более мелкоструктурными. В серии 2.4 и выше блокировки стали еще более мелкоструктурными. Сегодня в ядрах серии 2.6 блокировки имеют очень мелкую гранулярность, а масштабируемость получается очень хорошей.

Структурность (гранулярность, granularity) блокировки — это описание объемов тех данных, которые защищаются блокировкой, например все структуры данных одной подсистемы. С другой стороны, блокировка на уровне очень мелких структурных единиц (fine grained), используется для защиты очень маленького объема данных, например одного поля структуры. В реальных ситуациях большинство блокировок попадают между этими крайностями, они используются не для защиты целой подсистемы, но и не для защиты одного поля, а возможно для защиты отдельного экземпляра структуры. Большинство блокировок начинали использоваться на уровне крупных структурных единиц (coarse grained), а потом их стали разделять на более мелкие структурные уровни, как только конфликты при захвате этих блокировок становились проблемой.

Один из примеров перевода блокировок на более мелкий структурный уровень — это блокировки очередей выполнения планировщика (runqueue), которые рассмотрены в главе 4, "Планирование выполнения процессов". В ядрах серии 2.4 и более ранних планировщик имел всего одну очередь выполнения (вспомним, что очередь выполнения— это список готовых к выполнению процессов). В серии 2.6 был предложен O(1)-планировщик, в котором для каждого процессора используется своя очередь выполнения, каждая очередь имеет свою блокировку. Соответствующие блокировки развились из одной глобальной блокировки в несколько отдельных блокировок для каждой очереди, а использование блокировок развилось из глобального блокирования в использование блокировок на отдельных процессорах. Эта оптимизация очень существенна, так как на больших машинах блокировка очереди выполнения имеет очень высокий уровень конфликтов при захвате, что приводит к сериализации планирования выполнения процессов. Иными словами, код планировщика выполнял только один процессор системы в любой момент времени, а остальные процессоры — ждали.

В общем такое повышение масштабируемости — это очень хорошая вещь, которая позволяет повысить производительность операционной системы Linux на больших и более мощных системах. Чрезмерное увлечение "ростом" масштабируемости может привести к снижению производительности на небольших многопроцессорных и однопроцессорных машинах, потому что для небольших машин не требуются такие мелкоструктурные блокировки, а им приходится иметь дело с большей сложностью и с большими накладными расходами. Рассмотрим связанный список. Первоначальная схема блокировки обеспечивает одну блокировку на весь список. Со временем эта одна блокировка может стать узким местом на очень большой многопроцессорной машине, на которой очень часто обращаются к связанному списку. Для решения проблемы одна блокировка может быть разбита на большое количество блокировок — одна блокировка на один элемент списка. Для каждого элемента списка, который необходимо прочитать или записать, необходимо захватывать уникальную блокировку этого элемента. Теперь конфликт при захвате блокировки будет только в случае, когда несколько процессоров обращаются к одному элементу списка. Что делать, если все равно есть высокий уровень конфликтов? Может быть, необходимо использовать блокировку для каждого поля элемента списка? (Ответ: НЕТ.) Если серьезно, даже когда очень мелко структурированные блокировки хорошо работают на очень больших SMP-машинах, то как они будут работать на двухпроцессорных машинах? Накладные расходы, связанные с дополнительными блокировками, будут напрасными, если на двухпроцессорной машине нет существенных конфликтов при работе с блокировками.

Тем не менее масштабируемость — это важный фактор. Важно с самого начала разрабатывать схему блокировок для обеспечения хорошей масштабируемости. Блокировки на уровне крупных структурных единиц могут стать узким местом даже на машинах с небольшим количеством процессоров. Между крупноструктурными и мелкоструктурными блокировками очень тонкая грань. Слишком крупноструктурные блокировки приводят к большому уровню конфликтов, а слишком мелкоструктурные — к напрасным накладным расходам, если уровень конфликтов при захвате блокировок не очень высокий. Оба варианта эквивалентны плохой производительности.

Необходимо начинать с простого и переходить к сложному только при необходимости. Простота — это ключевой момент.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Кивино гнездо: Конфликт криптографии и бюрократии Берд Киви

Из книги Цифровой журнал «Компьютерра» № 24 [05.07.2010 — 11.07.2010] автора Журнал «Компьютерра»

Кивино гнездо: Конфликт криптографии и бюрократии Берд Киви Опубликовано 09 июля 2010 года Новая структура в составе вооруженных сил США, получившая название «киберкомандование» и базирующаяся в штаб-квартире Агентства национальной безопасности в


WordPress и Thesis: лицензионный конфликт Крестников Евгений

Из книги Цифровой журнал «Компьютерра» № 27 [26.07.2010 — 01.08.2010] автора Журнал «Компьютерра»

WordPress и Thesis: лицензионный конфликт Крестников Евгений Опубликовано 27 июля 2010 года Конфликты по поводу нарушения GPL между разработчиками свободных и проприетарных программ — дело обычное. Лицензия не мешает зарабатывать деньги (в качестве примера


Конфликт имен

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Конфликт имен Каждый класс обладает доступом ко всем компонентам своих родителей. Он может использовать их, не указывая тот класс, в котором они были описаны. После обработки inherit в классе class C inherit A ... метод f класса C становится известен как f. То же справедливо и для


Конфликт переопределений

Из книги Инфраструктуры открытых ключей автора Полянская Ольга Юрьевна

Конфликт переопределений Пока в ходе наследования мы меняли лишь имена. А что, если промежуточный предок, такой, как B или C (см. последний рисунок), переопределит дублируемо наследуемый компонент? При динамическом связывании это может привести к неоднозначности в


Масштабируемость решения

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

Масштабируемость решения Функционирование системы PKI так или иначе затрагивает многие ресурсы (персонал, аппаратное и программное обеспечение), поэтому нельзя не учитывать, что с течением времени масштаб системы может существенно возрасти. Очевидно, что разнообразие


Масштабируемость и производительность

Из книги Linux программирование в примерах автора Роббинс Арнольд

Масштабируемость и производительность Наконец, с развертыванием сервиса репозитория связаны потенциальные проблемы масштабируемости и производительности. Очевидно, что необходимое количество серверов зависит от количества конечных пользователей, а также от срока


Масштабируемость

Из книги Цифровой журнал «Компьютерра» № 168 автора Журнал «Компьютерра»

Масштабируемость Появление сравнительно недорогих компьютерных сетей между 1980-ми и 1990-ми годами вызвало увеличенный спрос на масштабируемые информационные системы с дружественным пользователю интерфейсом. Программное обеспечение электронных таблиц и настольных баз


14.2.2.1. Описание блокировки

Из книги Цифровой журнал «Компьютерра» № 181 автора Журнал «Компьютерра»

14.2.2.1. Описание блокировки Прежде чем рассмотреть осуществление блокировки, давайте исследуем описание блокировки в операционной системе. Это делается при помощи структуры struct flock, которая описывает диапазон блокируемых байтов и вид нужной блокировки. Стандарт POSIX


Многосторонний конфликт: особи, гены и мемы; индивиды и группы; ближние цели и отдалённые перспективы Дмитрий Шабанов

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Многосторонний конфликт: особи, гены и мемы; индивиды и группы; ближние цели и отдалённые перспективы Дмитрий Шабанов Опубликовано 11 апреля 2013 В прошлой колонке мы говорили о нескольких механизмах эволюции и способах наследования, которые их


Зачем нужна фотокамера: конфликт реальности и магии на мегапиксельном поле боя Василий Щепетнёв

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Зачем нужна фотокамера: конфликт реальности и магии на мегапиксельном поле боя Василий Щепетнёв Опубликовано 12 июля 2013 Редкий человек обходится сегодня без фотокамеры.Обыкновенно первый фотик дарят на день рождения, реже — на свадьбу или


Режим блокировки

Из книги Главный рубильник. Расцвет и гибель информационных империй от радио до интернета автора Ву Тим


7.5.4. Блокировки

Из книги Разработка ядра Linux автора Лав Роберт

7.5.4. Блокировки В файле /proc/locks перечислены все блокировки файлов, установленные в настоящий момент в системе. Каждая строка соответствует одной блокировке.Для блокировок, созданных функцией fcntl() (описана в разделе 8.3. "Функция fcntl(): блокировки и другие операции над


Идеологический конфликт

Из книги автора

Идеологический конфликт Уильям Ходкинсон имел свои твердые представления об идеальном устройстве киноиндустрии{153}. Читатели помнят, что он был в своем кругу белой вороной: уроженец штата Юта, единственный среди лидеров бунта не еврей-иммигрант. Начав свой путь в


Блокировки

Из книги автора

Блокировки Теперь давайте рассмотрим более сложный пример конкуренции за ресурсы, который требует более сложного решения. Допустим, что у нас есть очередь запросов, которые должны быть обработаны. Как реализована очередь — не существенно, но мы будем считать, что это —


Секвентные блокировки

Из книги автора

Секвентные блокировки Секвентная блокировка (seq lock) — это новый тип блокировки, который появился в ядрах серии 2.6. Эти блокировки предоставляют очень простой механизм чтения и записи совместно используемых данных. Работа таких блокировок основана на счетчике