Ядро Linux 2.6.22 - впечатления

Давно смотрел и ждал этой версии, так как обещали много интересного и полезного. И вот оно вышло! Немного распинав текущие дела, погрузился в изучение того, о чём так долго говорили большевики (с). Забегая вперёд, могу сказать: оно того стоило.

Здесь в основном - впечатления от использования и некоторое время работы с новым ядром 2.6.22, графики и диаграммы построить ещё не успел. Так что только впечатления.

Диспозиция
Дело происходит на моём многострадальном ноутбуке, работающем под управлением Debian Etch с кусочками Sarge, GCC 4.1 и на тот момент ядром 2.6.20-ck. Ядро с патчами Кона Коливаса меня в принципе устраивало, но всё-таки хотелось большей отзывчивости системы.

Зачем я ввязался в авантюру с Low Latency
Дисковая система ноутбука - самое слабое его место: она очень медленная (по сравнению с десктопом), и при плотной многозадачной нагрузке отзывчивость системы становится неприлично большой. Выход есть: несколько пожертвовав производительностью, получить отзывчивую систему (фактически, Soft Realtime OS). Это достигается наложением low-latency патчей, при этом работа с дисковыми операциями ещё немного "проседает" по производительности, но зато при поиске писем в Thunderbird и одновременной сортировке Scrapbook в Firefox музыка не заикается и ОпенОфис не притормаживает. Все эти танцы с бубном того стоят: такой же ноутбук с дефолтной убунтой на борту глотает пыль с копыт тюнингованного low-latency Дебиана с IceWM :-)
Я использовал конфиг от 2.6.20-ck, что мне вообще говоря мало помогло: конфигурирование ядра немного изменилось, так что пришлось быстро пробежаться и расставить недостающие флажки там, где они нужны.



Вкусное и полезное

Многое было заявлено и обещано - теперь осталось это протестировать и воспользоваться.


Новая система управления памятью

Не буду утомлять подробностями, в которых я и сам не до конца разобрался :-) Одно становится понятным после прочтения топиков в LKML: SLUB быстрее и богаче возможностями. Поэтому выбираем его:
General setup --- Choose SLAB allocator (SLUB (Unqueued Allocator))
Если что, краткий комментарий:
SLUB is a slab allocator that minimizes cache line usage instead of managing queues of cached objects (SLAB approach). Per cpu caching is realized using slabs of objects instead of queues of objects. SLUB can use memory efficiently and has enhanced diagnostics.
Более эффективно работает с памятью - этого мы и ждали.


Low-latency патчи Инго Молнара
Кон и Инго долго боролись и доказывали, чей планировщик задач круче и где. В основном победила точка зрения Инго, и Кон Коливас отказался от своих затей с патчами и больше их не ведёт. Откровенно говоря, я не очень ощущал прирост отзывчивости в ck-патчах. Да, лучше, чем на обычном ядре, но не на столько.
Патчи Молнара (планировщик задач с полностью справедливым распределением ресурсов CFS, Completely Fair Scheduler) наложились без истерик - тихо и гладко. Забегая вперёд, могу сказать: после загрузки я подумал, что моему ноутбуку вставили здоровенное шило куда нужно - настолько он стал отзывчивее к моим действиям. Запуск всех крупных приложений, параллельная сборка нового ядра, поиск в Thunderbird и Firefox и ещё куча всего так и не смогли прервать хотя бы на миг музыку.


Tickless-system - высокоточные часы системы
Processor type and features --- [*] Tickless System (Dynamic Ticks)
В новом ядре появилась эта давно обещанная возможность. Насколько я понял, это повышает точность распределения времени задачам. По этому поводу особенно заметны улучшения при воспроизведении видео Mplayer и работы эмулятора QEMU.
На всякий случай:
This option enables a tickless system: timer interrupts will only trigger on an as-needed basis both when the system is busy and when the system is idle.
Роман Химов пояснил в комментариях (за что ему большое спасибо):
Cистема сможет больше "спать" при отсутствии загрузки. Обычно как дело обстоит, если железяке нечего делать (ни один процесс не хочет процессорного времени), она так или иначе "засыпает". Однако через 1/n (где n то самое CONFIG_HZ, стандартно 250 вроде бы сейчас) секунды таймер стучится в процессор прерыванием, будит систему, ядро снова решает, хочет ли кто-нибудь процессора, если никого нет, снова впадает в спячку, но через 1/n секунды опять получает пинок от таймера.


Ну и другое...

Не забываем включить FUSE, поддержку нужных устройств, Magick SysRq клавишу (на всякий случай, полезное дело), все планировщики IO (так как у меня ReiserFS3.6, ставлю Anticipatory).


Загрузка и работа
Загрузка стала происходить немного быстрее, исчезли некоторые сообщения об ошибках.
Первые впечатления после загрузки: ухтывау :-) Всё стало отзывчивее на глаз раза в полтора: при сортировке Scrapbook в броузере переключение на другие задачи идёт мгновенно, как будто ничего и не происходит. При добавлении свопа - то же самое: создание гигового своп-файла идёт своим чередом, можно пока поправить документ в ОпенОфисе и немного поправить картинку в GiMP.
Все устройства на месте: кардридер работает, сеть и звук тоже. Всё, как и прежде, только быстрее и отзывчивее.
Так что если кто думает поэкспериментировать - дело стоящее.

32 комментариев: |высказаться!| RSS-лента дискуссии.|
Анонимный комментирует...

Tickless-system это немного не о том, это к тому, что система сможет больше "спать" при отсутствии загрузки. Обычно как дело обстоит, если железяке нечего делать (ни один процесс не хочет процессорного времени), она так или иначе "засыпает". Однако через 1/n (где n то самое CONFIG_HZ, стандартно 250 вроде бы сейчас) секунды таймер стучится в процессор прерыванием, будит систему, ядро снова решает, хочет ли кто-нибудь процессора, если никого нет, снова впадает в спячку, но через 1/n секунды опять получает пинок от таймера.

Так вот, эта фишка как раз и включает возможность реже сигналить таймером. Если ни один процесс не хочет процессора, то логично, что захотеть он это сможет только потому что

1) придёт прерывание от нужного ему устройства
2) подойдёт время таймера, установленного им же для себя же

Первое понятно, второе опять-таки контролируется полностью ядром, оно знает, когда будить тот или иной процесс и так или иначе обеспечит ему побудку.

Ну и зачем в свете этого каждые 1/n секунды будить ядро? Только для того, чтобы обнаружить, что никто не готов исполняться? Смысла нет. Вот и не надо значит заводить таймер, надо или ждать прерываний от устройств или взводить таймер уже так, чтобы пробудить приложение, которому это нужно во время X.

Это, естественно, образно и упрощённо, но главное, что ядро тем самым позволяет железу значительно большее время прохлаждаться без дела, если того самого дела нет. Что в первую очередь интересно на ноутбуках, конечно, и прочих мобильных аккумуляторно-запитываемых устройств.

В таком духе.

virens комментирует...

Роман, спасибо, что так грамотно и квалифицированно пояснили. То есть это экономит батареи, когда работа идёт от них, так?

CONFIG_HZ сейчас вроде 1000, а 250 рекомендуют для слабых систем.

P.S. Включил в пост часть комментария.

Анонимный комментирует...

Ну и экономит электричество при работе от сети. :)

Говорят, помогает очень здорово. Можете попробовать сами провести тест с лёгкой работой вроде лазанья по Сети или разбора почты на одном ядре и другом, насколько хватит батарей. Ну и крайний тест вообще включить, загрузить и оставить, пока батареи не кончатся, опять-таки, в обоих случаях.

Но есть ещё момент, что сами приложения не должны хотеть просыпаться часто. :) То есть, если приложение взводит само для себя таймер раз в секунду для тех или иных целей - это уже нехорошо. Но над этим уже работают авторы приложений, так что, думаю, осенью (когда выйдут новые релизы и потихоньку будут подобраны дистрибутивщиками) можно будет ожидать чудесных дистрибутивов для ноутбуков, которые будут работать очень эффективно с точки зрения энергопотребления. При правильных приложениях с таким ядром, система сможет спать вплоть до пары десятков секунд и даже более.

Вообще, последние изменения (это, новые асинхронные вызовы) всё больше переводят Linux к событийно-ориентированной модели, что, на мой взгляд, просто отлично.

Ещё поражает, как при такой скорости мутаций ядро остаётся работоспособным, изменения просто колоссальные. :)

virens комментирует...

2 Роман Химов пишет...
Говорят, помогает очень здорово. Можете попробовать сами провести тест
Уже проводил: на ядре 2.6.15.7 проработал больше 5 часов автономно от батарей - конечно, яркость экрана на минимум... Очень впечатлило. Сейчас должно стать больше.

Но есть ещё момент, что сами приложения не должны хотеть просыпаться часто. :)
В общем, да. Но если я интенсивно пишут что-то на клавиатуре - тут уж пардон. Ну и ещё всякие индикаторы могу вносить свою лепту.

Вообще, последние изменения (это, новые асинхронные вызовы) всё больше переводят Linux к событийно-ориентированной модели, что, на мой взгляд, просто отлично.
Безусловно. Вообще радует развитие ядра в сторону "дальше-выше-сильнее". Устройства поддерживаются отлично - то ли ещё будет! В интересное время живём! :-)

Ещё поражает, как при такой скорости мутаций ядро остаётся работоспособным, изменения просто колоссальные. :)
Это точно. И тем не менее, погоняв свежесобранное 2.6.22 на тестах, ничего подозрительного не выявил. Работает отлично!

Роман, ещё раз спасибо за такой развёрнутый комментарий!

JaGoTerr комментирует...

Во-первых, спешу расстроить людей, использующих x86_64-архитектуру (имеется в виду не просто соответствующее железо, а собранные под это дело дистрибутивы). Так вот, tickless sytem обещают лишь в версии 2.6.23.

Кроме того, хотелось бы уточнить, что tickless-system появилась не в 2.6.22, а уже в предыдущей стабильной версии - 2.6.21 (опять же - пока только для 32-битных архитектур).

И опять про неё же. tickless-system предусматривает синхронизацию различных таймеров для выполнения нескольких действий, связанных с их срабатыванием, за одно просыпание процессора. Что тоже достаточно сильно должно экономить электроэнергию.

Анонимный комментирует...

Во-первых, спешу расстроить людей, использующих x86_64-архитектуру (имеется в виду не просто соответствующее железо, а собранные под это дело дистрибутивы). Так вот, tickless sytem обещают лишь в версии 2.6.23.
Да, это, к сожалению, пока недоступно на amd64. И, возможно, не будет даже в 2.6.23:
http://kerneltrap.org/node/11751

Посмотрим.

Анонимный комментирует...

А как там новый wi-fi стек? Не тестировали?

virens комментирует...

2 Анонимный пишет...
А как там новый wi-fi стек? Не тестировали?
Тестировал - отлично. Мой Intel Wireless Pro 2200 завёлся с полоборота. Скачал его фирмваре, кинул в каталог, включил в ядре поддержку - и всё. Правда, беспроводных сетей у нах нигде нету :-(

jetxee комментирует...

Спасибо за пост. Весьма-весьма любопытно. Low latency патчи может как-нибудь и попробую на своём ноутбуке, когда работы не будет :) В любом случае, новости очень хорошие.

Пока останусь на 2.6.21-2-686 из Debian/testing.

virens комментирует...

2 jetxee пишет...
Low latency патчи может как-нибудь и попробую на своём ноутбуке, когда работы не будет :)
На самом деле, по сравнению с патчами Коливаса прирост просто на гла раза в полтора. Всё летает так, аж самому страшно :-) Отзывчивость потрясающая, работа - очень стабильна.

Maxim Filatov комментирует...

Привет, очень вкусно все описано. А можно поинтересоваться какая конфигурация ноута? И еще как собирать ядро именно в дебиан, которое было скачено? т.е. я вот здесь http://mczim-debian.blogspot.com/2007/04/blog-post_18.html
описывал как ПЕРЕСОБРАТЬ ядро, т.е. то которое уже установлено, но необходимо чтонить включить/выключить, очень удобный метод сборки, случайно нет ли такого же малокровного метода сборки НОВОГО ядра?

Анонимный комментирует...

> так как у меня ReiserFS3.6, ставлю Anticipatory

И чем он лучше для reiserfs чем cfq ?
чем теоретически отличаются планировщики я знаю, в крайнем случае вот описание -- http://www.opennet.ru/base/sys/io_scheduler_linux.txt.html

ЗЫ ноута у меня нет

virens комментирует...

2 mczim пишет...
А можно поинтересоваться какая конфигурация ноута?
Можно. Сейчас у меня Linux notebeast 2.6.22-cfs-v19 #1 PREEMPT Wed Jul 11 21:57:17 MSD 2007 i686 GNU/Linux


И еще как собирать ядро именно в дебиан, которое было скачено?
Есть make-kpkg, но я по-старинке собираю дедовским make bZimage :-)

2 vadiml пишет...
> так как у меня ReiserFS3.6, ставлю Anticipatory

И чем он лучше для reiserfs чем cfq ?

Ганс Рейзер говорил, что его ФС наилучшим образом работает с Anticipatory планировщиков. Ссылку не помню.

Анонимный комментирует...

Тоже поделюсь впечатлениями ) Вчера вечером переехал на новое ядро 2.6.22-1. Почитав про прелести realtime ядра, проникся идеей, пропатчил, скомпилил загрузился... Особых изменений в работе пока не заметил. Кстати, есть ли какой-нибудь способ наглядно это посмотреть или изменения ощущаются на субъективном уровне. Из странностей выделю, что теперь процессорное время жрут и прирывания(например IRQ-17 жрет 0,3-0,7%CPU - на нем wifi висит + какие-то softirq* - но эти ничего, вроде бы, не жрут, только в top глаза мозолят) Это нормально?? Из хорошего - заработал встроеный кард ридер, на предыдущем ядре заводился только с бубном :) Из плохого, не ставится fglrx, говорит что не совместим с каким-то символом "__rcu_read_unlock" - есть подозрение, что это из-за риал тайм сборки, точнее из-за rcu preempt. Ну да это я переживу, благо опенсурс дрова пашут как надо )

Maxim Filatov комментирует...

2 virens: да есть, но я так понимаю ядра других версий (те что не стоят в системе) он не будет собирать!

Maxim Filatov комментирует...

я ошибался, make-kpkg все замечательно собрал!

virens комментирует...

2 summer пишет...

Особых изменений в работе пока не заметил. Кстати, есть ли какой-нибудь способ наглядно это посмотреть или изменения ощущаются на субъективном уровне
Пока на субъективном: загрузился с дистрибутивного ядра и потом со своего. Порадовался :-) На графики смотреть не могу - по работе с ними приходится возиться...


Из странностей выделю, что теперь процессорное время жрут и прирывания(например IRQ-17 жрет 0,3-0,7%CPU
:-0 Ничего себе... у меня такого нет - всё тихо и спокойно. Только Xorg ест 3-4%, остальные сидят смирно. Даже cpu_freq работает, постоянно переключая систему в состояние с пониженной частотой процессора. И ничего.

Это нормально??
Не очень. Может, что с установками в ядре намудрили?

Из хорошего - заработал встроеный кард ридер, на предыдущем ядре заводился только с бубном :)
Да, вот это радует. У меня мой кардридер с 2.6.20 работает и сейчас каши не просит.

2 mczim пишет...
я ошибался, make-kpkg все замечательно собрал!
Да, конечно. Но мне лень и я известный ретроград :-)

Анонимный комментирует...

А подскажите пожалуйста накладывая патчи Молнара какие опции надо в конфиге включать?

virens комментирует...

2 das-ich комментирует...
А подскажите пожалуйста накладывая патчи Молнара какие опции надо в конфиге включать?
Там появится tickless, насколько я помню, и многие флажки (типа low-latency) уже будут включены. Не помню, чтобы там было что-то особенное.

Анонимный комментирует...

Con Kolivas, похоже, прекратил сабмитить патчи, больше не будет этого делать :-( http://apcmag.com/6735/interview_con_kolivas

Unknown комментирует...

Кон Коливас действительно прекратил делать патчи, при чём он делал не только CPU Sheduler, а ещё и кое-что связанное с I/O Sheduler + мелкие багфиксы. сегодня читал его развёрнутое интервью. очень понравились многие точки зрения, на английском оно вот здесь .
ванильное ядро 2.6.22 так и не получилось собрать - не могу разобраться, что нужно моему сата-контроллеру на ноутбуке, а включать всё подряд не хочется принципиально.

das-ich:
А подскажите пожалуйста накладывая патчи Молнара какие опции надо в конфиге включать?

патчи Молнара, вошедшие в mainline, - появился Low-Latency Preemption в разделе выбора sheduler'a CPU. Tickless System появилась опция - она самая первая в разделе опций о CPU. ещё у Молнара есть CFS I/O sheduler - для него патчи, как я понял, не вошли в mainline и их можно скачать и наложить. опций они вроде никаких не добавляют. хотя я честно не уверен в вышеизложенном, буду благодарен, если меня поправят.

Ilya Epifanov комментирует...

Кстати я вот перелез с reiser на xfs и получил неплохое улучшение реакции системы , но упала производительность на большом кол-ве мелких файлов (проект из 4000 файлов, во время сборки образуется еще примерно 6000). Так что планирую проект собирать на разделе с reiser, а работать на xfs как-то лучше:)

virens комментирует...

2 Анонимный пишет...
Con Kolivas, похоже, прекратил сабмитить патчи, больше не будет этого делать :-(
Да, я читал про эту историю. В общем, позиция Линуса ясна, и где-то он прав...

2 idtest пишет...
ванильное ядро 2.6.22 так и не получилось собрать - не могу разобраться, что нужно моему сата-контроллеру на ноутбуке
Может быть, поддержка initrd и файловых систем? :-) У меня такое бывает.

2 das-ich:
А подскажите пожалуйста накладывая патчи Молнара какие опции надо в конфиге включать?
Патчами заменяется одно другим, так что на menuconfig это не отражается. Во всяком случае, я никаких изменений в конфиге не обнаружил.

Tickless System появилась опция
Это не Молнар делал :-) Но тоже стоит включить.

2 Elijah Epifanov пишет...
Кстати я вот перелез с reiser на xfs и получил неплохое улучшение реакции системы , но упала производительность на большом кол-ве мелких файлов
Занятно. Про мелкие файлы в общем понятный результат, но вот насчёт отзывчивости - удивлён. Как бы это замерить?

Ilya Epifanov комментирует...

Про reiser и др.
Основной минус reiser состоит в кол-ве page fault'ов, почти в 3 раза больше, чем на других ФС (xfs, jfs, ext2/3 - на них примерно одинаково), что для ноута означает лишний своппинг. И как раз это меня очень сильно достало, 5400rpm и своп просто не совместимы и все тут! А маленький раздел для работы я все же сделаю reiser как только руки дойдут:)

Анонимный комментирует...

Может кто подскажет какие настройки компилятора дадут наилудший прирост в работе?
По работе необходимо сжимать/разжимать 7z по несколько гигабайт. Проводил серию тестов для связки gcc4.1+7z4.55+kernel2.6.22. На глазок при переходе от SemptronXP к AthlonXP X2 разница во времени 50%, двухканальный режим дает ещё 10%. Компиляция с оптимизацией по cpu/arch, fommit, function, loop, fpu (флаги оптимизации по группам), дают от +15% (fommit) до -10% (loop). Компиляция ядра с оптимизацией и CFS патчем +10%. Но остаются ешё нескольколько непонятных флагов, да и комбинация известных может быть неоптимальной.

virens комментирует...

2 Elijah Epifanov пишет...
Основной минус reiser состоит в кол-ве page fault'ов, почти в 3 раза больше, чем на других ФС (xfs, jfs, ext2/3 - на них примерно одинаково), что для ноута означает лишний своппинг.
Хотелось бы ещё и ссылок на тесты... ладно, буду посвободнее - проведу тестирование. Интересно аж стало :-)

2 Анонимный пишет...
Может кто подскажет какие настройки компилятора дадут наилудший прирост в работе?
Это сугубо личный вопрос - надо заниматься им на месте и под конкретное железо. Так наобум давать настройки я не могу :-)

fabiaN комментирует...

Недавно обновил Ubuntu до Gutsy 7.10 beta, в ней по умолчанию ядро 2.6.22. Интересно, оно УЖЕ должно быть с патчами Молнара? Каким способом лучше всего проверить это?
Спасибо.

nini комментирует...

fabiaN hat gesagt...

Недавно обновил Ubuntu до Gutsy 7.10 beta, в ней по умолчанию ядро 2.6.22. Интересно, оно УЖЕ должно быть с патчами Молнара? Каким способом лучше всего проверить это?
Спасибо.

Да, хороший вопрос.
Скоро выйдет новая убунта, будет ли там ядро уже с включенным падчем?

Ставил бету на один ноут(CelM 1.4G,512).
Система работает ощутимо медленнее (раньше туда же 6.10 ставил), даже медленнее чем на моем Ibm x30 (512MB).

Попробую на свой ибм патчик поставить...

fabiaN комментирует...

Что-то мне кажется, что вряд ли... Прочитал на хабре, человек специально ставил -rt ядро:
http://habrahabr.ru/blog/ubuntu/27143.html#habracut

p.s. а virens действительно знаменит ;)

virens комментирует...

2 fabiaN пишет...

Недавно обновил Ubuntu до Gutsy 7.10 beta, в ней по умолчанию ядро 2.6.22. Интересно, оно УЖЕ должно быть с патчами Молнара?
Нет, это не является мейнстримом. И если вы не занимаетесь математическими расчётами на ноутбуке в режиме catastrophic mode - вам эти патчи не нужны.

Кстати господам виндузятникам с хабра: вы себе даже представить не можете, что я делаю со своим ноутбуком! Винда в таких условиях гарантированно ложится в клипсидру и не отвечает по десяткам минут :-)

Каким способом лучше всего проверить это?
Напишите uname -a и если увидите RT - значит, оно есть. Но вы его не увидите :-)

2 nini пишет...
Система работает ощутимо медленнее (раньше туда же 6.10 ставил), даже медленнее чем на моем Ibm x30 (512MB).
Этим мне убунта и не нравится. Захожие виндуз-пользователи через две-три минуты сидения за моим ноутом говорят: мда, работает Луникс (!) неплохо... мммм... а что это на фоне работает!? Два матлаба!?!!? 8-0

Попробую на свой ибм патчик поставить...
Ещё нужно будет критичным задачам давать приоритет RT.


2 fabiaN пишет...
Прочитал на хабре, человек специально ставил -rt ядро: http://habrahabr.ru/blog/ubuntu/27143.html#habracut
Естественно, не ради одной музыки. У меня ноутбук управляет сложной оптической установкой в RT-режиме. Винда сливает с позором :-) Даже на двухядерном коредуба.

p.s. а virens действительно знаменит ;)
Чего, правда!? А я и не знал, а я в танке, да :-)

fabiaN комментирует...

2 virens:
И если вы не занимаетесь математическими расчётами на ноутбуке в режиме catastrophic mode - вам эти патчи не нужны.
Постойте, я может чего-то путаю, но в вашем посте озвучена цель наложение патчей - повышение отзывчивости системы. Причем тут ТОЛЬКО математические расчеты? Или я что-то пропустил?

Напишите uname -a и если увидите RT - значит, оно есть. Но вы его не увидите :-) Я имел ввиду несколько иное... Я думал, что ядро уже собрано с этими патчами и идет по умолчанию без каких-либо опознавательных знаков в названии. Но теперь уже понятно, что ядро с наложенными этими патчами в новой Ubuntu 7.10 имеет постфикс -rt.

p.s. причем тут виндузятники + хабр - не понял о_О

virens комментирует...

2 fabian
Постойте, я может чего-то путаю, но в вашем посте озвучена цель наложение патчей - повышение отзывчивости системы. Причем тут ТОЛЬКО математические расчеты? Или я что-то пропустил?
Ничего не пропустили. Я часто отправляю математические расчёты в фон, и при этом занимаюсь чем-то ещё: пишу статьи, веду лабораторный журнал, ищу публикации в гугл. И на фоне - музыка. И всё очень отзывчивое.

Я имел ввиду несколько иное... Я думал, что ядро уже собрано с этими патчами и идет по умолчанию без каких-либо опознавательных знаков в названии.
Нет-нет-нет, так никогда не бывает. Собирают ядра generic, то есть которые подойдут под среднюю машину. Никакой оптимизации, естественно, нет, тем более такой специфичной, как RT.

У меня ядро отзывается так:
2.6.22.1RT #7 PREEMPT RT
То есть полное вытеснение (Complete Preemption, RealTime).

Но теперь уже понятно, что ядро с наложенными этими патчами в новой Ubuntu 7.10 имеет постфикс -rt.
Постфикс оно может иметь любой, но содержит RT обязательно. Хотя если собирать ядро самому, это можно изменить.

p.s. причем тут виндузятники + хабр - не понял о_О
Там обсуждение моей статьи идёт, с феерически безграмотными комментариями пользователей оффтопика :-) Не важно.

Отправить комментарий

Подписаться на RSS-ленту комментариев к этому посту.