понедельник, 29 марта 2010 г.

ogg vs mp3

Есть одна песенка в двух файлах разных форматов:

ID_AUDIO_ID=0
ID_FILENAME=/home/vitaly/Nile/2005 - Annihilation Of The Wicked (320)/07 - Lashed To The Slave Stick.mp3
ID_DEMUXER=audio
ID_AUDIO_FORMAT=85
ID_AUDIO_BITRATE=320000
ID_AUDIO_RATE=44100
ID_AUDIO_NCH=0
ID_LENGTH=258.00
ID_SEEKABLE=1
ID_CHAPTERS=0
ID_AUDIO_BITRATE=320000
ID_AUDIO_RATE=44100
ID_AUDIO_NCH=2
ID_AUDIO_CODEC=mp3
ID_EXIT=EOF

и

ID_AUDIO_ID=0
ID_CLIP_INFO_NAME0=Title
ID_CLIP_INFO_VALUE0=Lashed to the Slave Stick
ID_CLIP_INFO_NAME1=Artist
ID_CLIP_INFO_VALUE1=Nile
ID_CLIP_INFO_NAME2=Album
ID_CLIP_INFO_VALUE2=Annihilation Of The Wicked
ID_CLIP_INFO_NAME3=Creation Date
ID_CLIP_INFO_VALUE3=2005
ID_CLIP_INFO_NAME4=Track
ID_CLIP_INFO_VALUE4=07
ID_CLIP_INFO_NAME5=Genre
ID_CLIP_INFO_VALUE5=Death Metal
ID_CLIP_INFO_NAME6=Comments
ID_CLIP_INFO_VALUE6=Created By xtopher@linuxmail.org With Gnormalize
ID_CLIP_INFO_N=7
ID_FILENAME=/home/vitaly/Nile/2005-Annihilation_Of_The_Wicked/Nile-Annihilation_Of_The_Wicked-07-Lashed_to_the_Slave_Stick.ogg
ID_DEMUXER=ogg
ID_AUDIO_FORMAT=vrbs
ID_AUDIO_BITRATE=0
ID_AUDIO_RATE=44100
ID_AUDIO_NCH=2
ID_LENGTH=257.87
ID_SEEKABLE=1
ID_CHAPTERS=0
ID_AUDIO_BITRATE=320000
ID_AUDIO_RATE=44100
ID_AUDIO_NCH=2
ID_AUDIO_CODEC=ffvorbis
ID_EXIT=EOF

Первая "весит" 9.9 Mб и звучит явно грязнее, чем вторая с её 4.1 Мб. Вот как так умудряются делать?

воскресенье, 28 марта 2010 г.

Bobrava strikes back

Хорошая штука - велосипед. Опять сегодня забирались в чащобы, куда бы своим пешим ходом вряд ли когда-нибудь попал. Тихо, спокойно, горы заячьего говнакрасивые виды со склонов диких поросших холмов.

Помнится, года два назад, будучи совсем ещё начинающим велосипедистом, жаловался на один спуск/подъём в природном парке Бобрава. Мол, ни на чём там проехать ну совершенно нельзя, даже спускаться пешком было страшно. Так вот, сегодня мы там с Иваном совершенно спокойно съехали. Конечно, промоины посередине тропинки огорчали, но никто не упал. Уровень катания растёт, хотя до самоубийцы-Вани ещё далеко. Тот лихо закладывает в повороты по корням, залетает перпендикулярно в канавы, и также лихо, бывает, падает.

А мне страшно... ;) Бывает, несёшься с горы в лесу, видишь, плохую рытвину, и она прямо магнитом притягивает. Хочешь как-нибудь по краю проехать, но всё внимание к этой пакости приковано, поэтому срываешься боком в неё. А там, под ворохом листьев, всякое неведомое говно лежит, велосипед начинает бить и кидать в стороны, и ты думаешь: "Ну вот, п-ц, приехал! Щас упаду!". И, вроде бы, обходится, благодаря вилке (реклама Suntour Epicon) и злющей резине (реклама Schwalbe Muddy Mary) на переднем колесе (реклама Ritchey Girder SC), но всё равно когда вижу очередную дырку в дороге, то непроизвольно подтормаживаю и гипнотизируюсь на этой дырке. Плохо. Надо на заднее колесо тоже Швальбу поставить и вообще на эти дырки не смотреть. Когда на дорогу не смотрю, то всё хорошо проходится почему-то ;)

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

Кстати! Я ж теперь мажор: велосипед к месту покатушек на машине вожу ;) Из отрицательных моментов: теперь если куда далеко ехать, то для велохрабрости кружку-другую пива не накатишь :(

Кстати, на летней резине машина даже с велосипедом на фаркопном держателе летать стала, будь здоров. Чуть зазевался, и уже нарушаешь.

суббота, 27 марта 2010 г.

Машинный день

Полдня посвятили машине: помыли на автомойке, пропылесосили коврики и багажник, почистили пластик в салоне, установили автовонючку, поменяли резину на летнюю (она у нас на литых дисках в склепе лежала). Для грамотного затягивания болтов был даже прикуплен динамометрический ключ. Заодно, визуально проверил толщину тормозных колодок, где-то 5-6 мм есть.

Машина теперь блестит и благоухает.

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

Вот после того, как с техникой повозишься, так сразу какая-то особая любовь к ней просыпается :) Наша вагонеточка... ;)

четверг, 25 марта 2010 г.

Arjun won

Индийские военные по результатам испытаний танков Т-90 (Россия) и Arjun (Индия) выбрали отечественный танк.

В принципе, другого предположить и нельзя было: за 34 года в танк вбухано столько средств, что это стало уже делом национального престижа. Тем более, что в танке использовано много лицензированных технологий, привлекались иностранные специалисты. Официальный отказ от танка означал бы, что индусы всё просрали и ни на что не способны. Хотя факт продолжения закупок Т-90 именно об этом и говорит, ну да ладно... ;) У нас "Булаву" тоже на вооружение, в конце концов, примут.

Картинка с танком доставила, всю суть аборигенской души раскрывает.

понедельник, 22 марта 2010 г.

lisp lulz

Подсмотрено здесь (про ленивое выделение памяти в SBCL):
> The net result is a sbcl with a memory footprint of 34MB. This to a
> system administrator looks a lot more reasonable then 800+MB and also
> allows the system to work with restrictive ulimits.

Only because most system administrators couldn't tell you the  
difference between virtual memory, real memory, and a toaster.

суббота, 20 марта 2010 г.

гОвна-2010

Долгожданная субботняя веловылазка в гОвна состоялась.  Поездили так себе, т.к. в лесу ещё полно снега со льдом. Прогалины с грязью по втулку воспринимались, как благо. Иван под конец катался по льду на боку, а я бродил по колено в воде. Неопреновые бахиллы, надо сказать, от луж по колено совершенно не спасают. В общем, ездить ещё сложно, на зубодробительных спусках крадёшься еле-еле, велосипед то в одну сторону вырывает, то в другую. Никакого удовольствия.  И всё равно это лучше, чем с бутылкой пива на диване перед телевизором время убивать!

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

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

Велосипеды в конце по-варварски отмыли в ручье. Дома только вытер цепь и смазал нормальным маслом.

Также сегодня совершенно случайно купил рюкзак Camelbak с гидропаком. Теперь я настоящий спортсмен: всё до последней нитки на себе, кроме носков, специальное, велосипедное ;)

четверг, 18 марта 2010 г.

Жена открыла велосезон

Сегодня был день повышенно чёткой погоды: солнце, почти нет ветра, +14. Мы с женой уехали с работы чуть раньше, облачились в велошмотки, поехали кататься. Жена тоже себе кое-какое недостающее осенне-весеннее барахлишко прикупила. Ваще, она в понтовых велошмотках (Кэнондейл, Эндура) вся такая стройная и  красивая, мужики летом будут шеи сворачивать и в колонну за ней выстраиваться.

Я недавно поменял цепи, перебрал свою вилку, понастраивал переключатели, поменял резину на байке жены. А т.к. любая перенастройка вносит косяки, то надо было перед предстоящим субботним выездом в говна эти косяки выявить и устранить.

На своём байке забыл прикрепить гидролинию переднего тормоза к штанам вилки, её чуть шипами колеса не вырвало. И ещё ход рамки переднего переключателя не ограничил, если неаккуратно на большую звезду системы цепь перекидывать, то её может совсем вышибить. А так, ничё. Вилка на 120 мм хода с правильно подобранным давлением работает архичудесно.

Байк жены настроен суперидеально, всё работает чётко и без косяков. Новая резина (Maxxis Crossmark 2.1") бежит сама, жена после полугодового перерыва без проблем въехала во все горки, куда раньше иногда пешком ходила.

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

Жду с нетерпением субботы.

среда, 17 марта 2010 г.

Письма от наших телезрителей

Отвечая на вопрос ln_123
 
Кстати как человек копавшийся внутри sbcl скажите что он так память жрет? А то потребление больше в разы чем на других реализациях. Интересно с этим можно что нибудь сделать?
  1. Аллокатор выделяет память кусками, равными 16 байт. Т.е. если на самом деле нужна пара байт, то 14 байт теряется впустую. 
  2. Маленькие объекты (меньше размера страницы) на границе страниц не создаются. Остаток страницы выбрасывается. Т.е. если в странице занято 32 байта (свободно 4064 байта), и запрашивается память под объект размером 4080 байт, то эта страница вместе со всеми своими свободными байтами выбрасывается.
  3. Большие объекты (больше размера страницы) создаются исключительно в начале страницы (как в пункте 2). Остаток последней страницы, занятой хвостом большого объекта, выбрасывается.
  4. Указатель на свободную память движется только вперёд. Если 99% объектов, созданных до текущего указателя, уже умерли, то память не освобождается до следующего запуска сборщика мусора.
В итоге, в нормальных условиях (памяти хватает) выделение памяти под объект в SBCL супербыстрое: просто увеличивается указатель на свободную память.

понедельник, 15 марта 2010 г.

Опровержение безобразия :)

В последнем посте я был неправ. Горькая правда в том, что странички кончиться не могут, ибо тут техника copy-on-write в действии. После успешного mmap() в адресное пространство подключается N раз одна единственная пустая страница с запрещённой записью. При обращении на запись ядро ловит protection fault, и делает копию пустой страницы. Таким образом, процесс очистки памяти получается ленивым.

Без реальной популяции замапленного региона (флагом MAP_POPULATE, либо прохождением с записью по страницам вручную) на моём проце (C2D T9600) munmap/mmap "ест" 1500-1600 тактов на область любого размера. Конечно, при первой записи в страницу (каждую) будет protection fault, который, как оказалось на практике, отнимает в районе 5000 тактов.

В сумме накладные расходы при размере страницы 4096 байт получаются 6500 тактов вместо 2000 при "честной" очистке, но ведь есть доказанный хирургический факт, что все свежеочищенные страницы в пуле памяти не будут нужны сию же минуту и все сразу. Поэтому с gc снимается часть нагрузки и размазывается по времени, уменьшая время ступора, в котором проводят треды при работающем gc. Отличное инженерное решение!

Наверное, честная очистка памяти средствами gc имеет смысл только при параллельном сборщике, работающем на выделенном ядре в smp-системе.

Безобразие!

Мать моя женщина! Он (автор gencgc в SBCL) юзает munmap+mmap для очистки страниц! Очистка 4096 байт с помощью топорного rep stosq "весит" 1900-2000 тактов (можно быстрее), а они делегируют эту задачу ядру, которое мало того, что два сисколла обрабатывает, ворошит vma, так ещё и делает ведь то же самое: чистит страницу.

Замер скорости показывает:

rep stosq:    1911 ticks
munmap/mmap: 50631 ticks

25-кратная разница.

воскресенье, 14 марта 2010 г.

GenCGC

Особенности работы сборщика мусора gencgc в SBCL убили весь смысл больших страниц:
С ростом размера страницы gc начинает тормозить в логарифмической прогрессии. Особо пока не разбирался, но, похоже, это из-за того, что gencgc использует read-write атрибуты страницы в качестве признака необходимости её сканирования. Т.к. теперь на одну страницу приходится 512 бывших маленьких, то одним попаданием в любую часть получаем 511 страниц, которые, возможно, и не надо бы сканировать.

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

Как не хочется ковыряться в 170кб сишных исходников... А надо...

P.s.: Надоело рисовать графики в gnuplot, решил потихоньку осваивать R :)

пятница, 12 марта 2010 г.

Hugepages патч

Так, вроде, в первом приближении сделал. Баги тоже должны быть.

http://paste.lisp.org/display/96287

Запускать так:

# echo 200 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# mkdir /dev/huge
# mount -t hugetlbfs none /dev/huge -o size=800M,mode=777
$ sbcl --hugetlbfs-path /dev/huge --huge-pages-nr 200
 
Тут создаётся 800 мб больших страниц и SBCL'ю говорится, где смонтирована hugetlbfs, и сколько страниц доступно. Есть fallback на обычную память.

Доработка для других осей, в которых возможно использование POSIX-интерфейса к жирным страницам, сводится к (на примере Линукса):

diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c
index 9b2e3cf..386fc25 100644
--- a/src/runtime/linux-os.c
+++ b/src/runtime/linux-os.c
@@ -56,6 +56,8 @@
 #include "cheneygc-internal.h"
 #endif
 
+#include "hugepages.h"
+
 #ifdef LISP_FEATURE_X86
 /* Prototype for personality(2). Done inline here since the header file
  * for this isn't available on old versions of glibc. */
@@ -313,7 +315,10 @@ os_validate(os_vm_address_t addr, os_vm_size_t len)
         addr=under_2gb_free_pointer;
     }
 #endif
-    actual = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
+    actual = huge_page_validate(addr, len);
+    if (!actual)
+        actual = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
+
     if (actual == MAP_FAILED) {
         perror("mmap");
         return 0;               /* caller should check this */
@@ -337,6 +342,7 @@ os_validate(os_vm_address_t addr, os_vm_size_t len)
 void
 os_invalidate(os_vm_address_t addr, os_vm_size_t len)
 {
+    huge_page_invalidate(addr, len);
     if (munmap(addr,len) == -1) {
         perror("munmap");
     }

Т.е. нужно всего-то подключить хидер и чуть-чуть модифицировать os_validate и os_invalidate.

четверг, 11 марта 2010 г.

SBCL и громадные страницы

Есть у SBCL одна неприятная черта: он манипулирует памятью постранично, страница практически везде 4кб. То есть просит память у ядра по 4кб, меняет атрибуты доступа постранично и так далее. А так как память он зело любит, то ворох мелких страниц загромождает vma в ядре, а постраничный mprotect в начале каждого цикла сборки мусора - это ахтунг (каждый сисколл "весит" около 1000 тактов плюс потери от сброса кэша L1).

Проблема с mremap'ом решается довольно простой доработкой сборщика мусора, там можно выделять непрерывные регионы страниц и менять атрибуты всем сразу. Вообще, как-то этот момент в SBCL подзапущен... Но ничего, поправим, улучшим, допилим.

Ещё давно хочется научить SBCL работать со страницами другой гранулярности. Современные x86-64 поддерживают т.н. huge pages размером ажно 2 мегабайта. Профита от таких страниц очень много, недаром тот же Оракел очень сильно рекомендует настраивать систему на их использование. Размер страницы в исходниках SBCL указывается всего в одном месте, в параметрах бэкенда, но, как обычно бывает, при слишком диком изменении параметра всплывает куча нехоженных косяков. Где-то полгода назад у меня ничего не получилось с доработкой, но сегодня какое-то мегахакерское настроение было, все всплывшие проблемы порешал одну за другой. Даже осуществил давнюю мечту: нашёл elf'овый бутстрап, который грузит образ, и потыкался в gdb :) Во всём оказались виноваты автоматически ненастраиваемые неведомые константы, которые пришлось выискивать в коде.

В общем, сейчас можно выделять память любой гранулярности, в том числе и требуемые 2мб, но перевод аллокатора на huge pages требует некоторого допила. Дело в том, что используемый анонимный mmap, не привязанный к дескриптору, не требует указания смещения, поэтому совершенно не годится для hugepages, которые доступны только ммапом на спец. файл. Соответственно, придётся аллокатору немножко интеллекта добавить, дабы он знал, какие части hugepages-файла заняты.

Буду надеяться, что работу завершу, и в скором времени SBCL просто немерянно разгонится по части работы с памятью. Особенно эффект будет заметен на жирном софте, который разворачивается на гигабайты памяти. Система тоже не будет надрываться при переключении контекста с/на SBCL, т.к. vma-цепочки сократятся ажно в полтыщи раз.

воскресенье, 7 марта 2010 г.

Кулинарное

Что-то меня на посты прорвало. Весна, видать...

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

Делается очень просто, минут за 5. Что касается вкуса... Ну как сказать... Самый хороший майонез, который ел на родине, по сравнению с hand-made - не лучше чешского :) Первая проба вышла неидеально, но всё равно офигенно вкусно, и в сто тыщ пятьсот раз лучше магазинного. Завтра втаримся рафинированным оливковым маслом и сделаем, как надо.

А пока вот всем голодным картинка:

Весна

Ездили мы сегодня в лес понюхать свежего воздуху. Собственно, действующие лица:


Как видно, снега в лесу ещё достаточно, но уже и много свободной от него площади. Где солнце бьёт прямой наводкой, там снега нет.

Природа тоже начала пробуждаться ото сна: на нас то и дело из чащобы выскакивали ведмеды, либо были замечены русалки на ветвях:



Ветви подетальнее:
 

Хорошо погуляли... Чаю из термоса напились, по серпантину на машине наездились, химикатов для изготовления пироженных "Тирамису" купили, чем сейчас после сарделек с горчицей и займёмся :)

А это мы пару недель назад с пацанами ждали, пока сауна нагреется:

 

Тов. А., ВФ и я.

суббота, 6 марта 2010 г.

Сукс чё-то...

Последние альбомы Marduk, Mayhem, Abigor, 1349 - говно. Не говоря уж про Immortal, которые ещё 10 лет назад сдулись. Опять же, пидоры в блэкметалле (Gorgoroth) - это недобрый признак, ох, недобрый... А ведь в былые времена мочили за одну только нетруЪшность...  Кстати, норвежский шансон от уголовника Варга порадовал, ага.

Всё-таки раньше трава точно была зеленее, водка пьянее...

Быстрее, выше, сильнее

Купил вот такие штуки:

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

Вилку раскочегарил до 120 мм, по спускам стало прикольнее лететь: центр тяжести назад переместился.
Грязь, подтаявшая на солнце, забивает переключатели и замерзает до состояния камня.

Открыл в этом сезоне падения: карабкался по северному склону по льду и неожиданно лёг на бок. Даже не успел обделаться лёгким испугом, так всё быстро произошло.

пятница, 5 марта 2010 г.

среда, 3 марта 2010 г.

Маленькая хитрость

Как скопировать ядерный патч из виртуальной машины на хост при отсутствии в виртуальной машине сети?

git diff > /dev/console

Сериальная консоль виртуалки, сессно, настроена, и её выхлоп завёрнут в файл (чтобы длиннющие трейсы изучать).

понедельник, 1 марта 2010 г.

StumpWM + tray

Для страждущих видеть всякую дребедень в трее...

StumpWM вполне дружит с bmpanel2. Запускать bmpanel2 нужно ДО StumpWM'а, плюс в ~/.stumpwmrc необходимо отрезать кусок экрана для панели:

(resize-head 0 0 25 1680 1025)

Выглядит вот так:


Панель показывает виртуальные столы, кнопки запущенных программ, рисует иконки в трее (NetworkManager по такому случаю поставил), плюс часы. Везде можно тыкать мышкой, работает даже перетаскивание кнопки программы на другой стол.

Если resize-head у вас нет, то в апстрим патч я так и не закоммитил ;)

Архив блога