LINUX.ORG.RU

Сообщения gag

 

потребление памяти git gc --aggressive

Почему при пережатии репозиториев такой разный расход памяти, что на это влияет, и существует ли правило хорошего коммита в контексте эффективности хранения?

Вот для первой репы одной конторы:

$ du -sh .git && time git gc --aggressive && du -sh .git
106M    .git
Counting objects: 85507, Fertig.
Delta compression using up to 8 threads.
Compressing objects: 100% (83185/83185), Fertig.
Writing objects: 100% (85507/85507), Fertig.
Total 85507 (delta 48961), reused 34092 (delta 0)

real    5m5.723s
user    16m53.928s
sys     0m11.548s
78M     .git
$

top:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 8739 gag  20   0 21,663g 0,015t  13192 S 200,0 95,26  16:03.76 git

Для пережатия 106MB --> 78 MB понадобилось 15+ GB памяти!!!

А вот для второй:

du -sh .git && LC_ALL=C time git gc --aggressive && du -sh .git
370M    .git
Counting objects: 441196, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (435440/435440), done.
Writing objects: 100% (441196/441196), done.
Total 441196 (delta 340323), reused 98133 (delta 0)
Checking connectivity: 441196, done.
1033.24user 3.64system 3:37.37elapsed 476%CPU (0avgtext+0avgdata 13100464maxresident)k
0inputs+566784outputs (0major+2111645minor)pagefaults 0swaps
282M    .git

top:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
15726 gag  20   0 12,640g 0,012t 337564 S 100,3 76,19  16:57.23 git

Понадобилось 12+ GB. Причём расход резко растёт с всего 1 GB на 99% (~434000 объект).

А если пережимать ванильный linux.git, который весит 860+ MB, то хватает и 4 GB оперативки.

$ du -sh .git && LC_ALL=C time git gc --aggressive && du -sh .git
862M    .git
Counting objects: 4147770, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4116901/4116901), done.
Writing objects: 100% (4147770/4147770), done.
Total 4147770 (delta 3484456), reused 663280 (delta 0)
Checking connectivity: 4147770, done.
4777.02user 31.57system 11:38.36elapsed 688%CPU (0avgtext+0avgdata 4787684maxresident)k
0inputs+1698728outputs (0major+20081695minor)pagefaults 0swaps
862M    .git
$

top:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
12637 gag  20   0 5148492 4,555g 852956 R 100,0 29,11  79:15.25 git

Как смотреть эти объекты по номеру, который выдаёт git в процессе пережатия?

И где формула для total <-> compressing <-> delta <-> reused объектов?

 , , ,

gag
()

Перехват вызова static функции в .so

Перехватить вызов функции из .so не проблема, если эту функцию дёргают за пределами самой либы. А кому-то удавалось так проманипулировать загруженный elf(?) got(?)/.., чтобы можно было сохранить и подменить адрес на свой?

Можно под gdb. Разумеется только если функция предварительно не инлайнена. Но думаю, если я в дизассемблере вижу тело функции, вызовы с её именем, значит, она там целиком.

 , , , ,

gag
()

Захват и воспроизведение USB трафика

С захватом всё просто:

# modprobe usbmon
$ wireshark

А вот как его «воспроизвести»? Т.е. нужно посылать то, что OUT, потом читать и сверять с тем, что IN. Кстати, нужен только payload, т.е. можно использовать libusb.

 , , , ,

gag
()

разделение git pull --rebase на онлайн и оффлайн составляющие

Цель: находясь онлайн быстро выкачать изменения для склонированных репозиториев, а потом оффлайн обновить их (что длится дольше из-за обычного hdd).

Вроде как

git pull --rebase
эквивалентен
git fetch
git rebase

Но есть и другое мнение.

По крайней мере о 100% эквивалентности точно говорить не приходится:

$ diff -rq 1-fetch-rebase/some-repo.git 1-pull-rebase/some-repo.git
Files 1-fetch-rebase/some-repo.git/.git/index and 1-pull-rebase/some-repo.git/.git/index differ
Files 1-fetch-rebase/some-repo.git/.git/logs/HEAD and 1-pull-rebase/some-repo.git/.git/logs/HEAD differ
Files 1-fetch-rebase/some-repo.git/.git/logs/refs/heads/master and 1-pull-rebase/some-repo.git/.git/logs/refs/heads/master differ
Files 1-fetch-rebase/some-repo.git/.git/logs/refs/remotes/origin/some-branch and 1-pull-rebase/some-repo.git/.git/logs/refs/remotes/origin/some-branch differ
Files 1-fetch-rebase/some-repo.git/.git/logs/refs/remotes/origin/master and 1-pull-rebase/some-repo.git/.git/logs/refs/remotes/origin/master differ
$

И это в простом случае, а если действительно upstream чего-то намудрит?

Кстати, а кто-нить встречал тесты для подобных хитрых изменений? Т.е. хэлпе и на stackoverflow встречаешь диаграммы коммитов, а есть ли готовые тестовые репозитории с этими коммитами?

Или если команды неэквивалентны, то это баг?

 

gag
()

clang линкует libgomp но не использует доп. потоки

Так clang (3.4, 3.5) умеет OpenMP через libgomp или нет? Добавляю -fopenmp. Всё успешно собирается, хотя _OPENMP и не определено. Запускаю, omp_get_max_threads() реагирует на изменения OMP_NUM_THREADS, но используется всё равно только один поток. Такое впечатление, что clang просто проигнорировал все pragma, но слинковал omp_ функции к libgomp. Но кому такое нужно?

 , ,

gag
()

Рендеринг анимации на маленьком кластере

Есть ssh доступ к небольшому кластеру (где-то дюжина ПК). Как бы не заморачиваясь запустить рендеринг анимации?

Нащупал 2 варианта.

- network render. Но можно ли подключить этот addon просто из командной строки?

- совсем просто:

blender -b animation.blend -a >log.txt 2>&1

Вот только в последнем варианте надо:

  • указать какие фреймы будут рендериться
  • изменить log.txt на log-hostname.txt
  • запустить их на почти всех узлах (пара ПК часто используется - не хотелось бы их загрузить на полную катушку)

И всё это из скрипта, а не вручную для каждого.

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

 , , ,

gag
()

Продолжение синхронизации большого файла после обрыва связи

Никак не пойму, как заставить rsync справиться с обрывом связи. Во-первых, он, кажется, вообще этого не замечает. После ctrl-c есть два варианта: или использовать уже синхронизированный кусок, но тогда игнорируется наличие оригинального файла, который следовало бы использовать. Наоборот: игнорируется уже синхронизированное. Я проглядел какой-то подходящий ключик или rsync до сих пор так не умеет?

 ,

gag
()

Заменить слово, игнорируя блоки

Необходимо заменить (sed, awk, perl,..) «long», но игнорируя комментарии, строки ("...") и т.п.

/*
   (...) long comment (...)
*/

   // not so long comment

   long l = 0;

/*
   (...) long comment (...)
*/

// not so long comment

printf("long message");

При портировании на си понадобилось поменять тип данных с long на, скажем, int32_t.

Регулярка для комментариев выглядит понятно:

(\/\*([\s\S]*?)\*\/)|(\/\/(.*))
Но как её «инвертировать», вроде:
s/?!(\/\*([\s\S]*?)\*\/)|(\/\/(.*))long/int32_t/g
?

 , , ,

gag
()

MPI и скриптовые языки

Ищу вариант, на чём можно быстро написать код, использующий MPI. В идеале - octave, т.к. код - алгоритмы из вычислительной линейной алгебры. Но octave-mpi не поддерживает даже broadcast. Остаётся pmatlab, который якобы должен работать и с octave. Кто-то пробовал (в частности с 3.6 и 3.8)?

Следующее, что приходит в голову - numpy и mpi4py. Я не фанат питона, но есть ли выбор?

 , ,

gag
()

MPI: peer-to-peer или нет?

Запускаю mpi-прогу в 2 процесса на одном хосте. Смотрю wireshark'ом - каждый процесс открыл сокет к mpirun (мастер/сервер-процессу?), и он в свою очередь пооткрывал соединения к каждому процессу. Не ожидал. Коммуникация такая дорогая, а здесь появляется посредник на ровном месте. В обычном кластере ПК подключены к одному роутеру, т.е. топология - обычная звезда. Или необходимо явно указать топологию (MPI_Graph_create,..) и тогда процессы установят необходимые прямые соединения?

 , , ,

gag
()

Хочется открытого железа - лучше сразу логики.

Ищу народные 10, 20, 40 Гб/с решения. Особенно в свете объявления 10-Гб апдейта USB так хочется если не 10-Гб-инфинибанда, то хотя бы эзернета.

А тем временем уже есть открытый SATA Groundhog: вся логика! А вот перейти дорогу всяким Mellanox, QLogic, HP,.. пока никто не осмеливается. Или кто-то уже встречал такое?

 , , , ,

gag
()

Бег с препятствиями для получнеия GPL/LGPL исходников

Например, Mellanox требует символической платы, которую, правда, надо им послать спецпочтой да ещё и в виде спецчека. А ещё нужно указать точно, какой именно «компонент» нужен, а если нужны несколько, то...

Не противоречит, конечно, требованиям лицензий, но какие ещё фирмы такое практикуют?

И сколько же они там ГПЛя использовали, что на одну/две «компоненты» им целый CD нужен...

 , , ,

gag
()

Новое издание The C++ Programming Language от Bjarne Stroustrup

В мае должно было выйти новое издание книги: 10 мая в Западной Европе по цене 63 евро и 19 мая в США по цене... 55 долларов. При этом в Европе книга «вышла» уже как неделю назад, но её до сих пор могут выслать лишь через 9-12 дней! А в штатах она как бы прямо сейчас ещё не должна была выйти (у них там сейчас всё ещё 18 мая), но тем не менее она уже на складе и готова к отправке.

Вопросов 2: что это за несправедливость касательно цены!? И знают ли обитатели Западной Европы, нет ли возможности получить её там по цене из штатов?

 ,

gag
()

Подход к портированию, если sizeof(char)=2

Ищу подход, как с наименьшими усилиями портировать код под архитектуру, где sizeof(char)=sizeof(int_8t)=2. Проблема: обмен данными с хостом, у которого привычный размер char, равный 1.

Обычные объявления

typedef struct foo {
  char f1;
  char f2;
};
можно, на первый взгляд, обойти битовыми полями:
typedef struct foo {
  char f1 : 8;
  char f2 : 8;
};
А как элегантно справиться с
typedef struct foo {
  char f[6];
};
?

 , ,

gag
()

Автоматический слэш для всех URL

Можно зайти на оба адреса:

http://www.linux.org.ru/forum/xxx/yyy
http://www.linux.org.ru/forum/xxx/yyy/
Кажется, корректней было бы, чтобы в первом случае URL автоматически переписывался со слэшем на конце.

И так по всему сайту.

P.S. Может, кто видел официальные рекомендации на этот счёт?

 , ,

gag
()

hg archive меняет .hg/cache/tags

По мотивам решения для git.

При переносе только .hg рабочий каталог можно восстановить вот так (многословно по сравнению с git, можно короче?):

mkdir ../tmp
hg archive ../tmp
rm ../tmp/.hg_archival.txt
mv ../tmp/* .
mv ../tmp/.hg* .
rmdir ../tmp
Но при этом всё таки изменяется .hg/cache/tags. Зачем?

 , , ,

gag
()

Перенос каталога .git и «восстановление» файлов проекта

Склонировал большой репозиторий, хочу его скопировать на другой ПК: для этого копирую только .git, потом необходимо checkout'нуть локально всё.

Пока нашёл только

git reset --hard
git checkout
Но тогда меняются
.git/ORIG_HEAD
.git/index
Есть способ checkout/reset/revert/... так, чтобы .git не менялся? Т.е., грубо говоря, состояние git скопированного проекта не отличалось от источника с соседнего ПК.

 , ,

gag
()

Разросшиеся зависимости qt5 от libxcb-xxx-dev

Что изменилось в qt5, чтобы так разрослись зависимости? Может, кто знает ссылку на точное объяснение?

 , , , ,

gag
()

Отличие в размере оригинального и восстановленного jpg

В своё время обзавёлся большой карточкой для фотика, чтобы как можно дольше не удалять с него. Карточку подключал также через USB3-ридер. И вдруг... ридер перестал нормально работать с карточкой (вылезали ошибки). А потом я заметил, что и фотки с видео исчезли. Учитывая, что я бережно обращался с фотиком (за исключением использования этого ридера), не ожидал такого поворота.

В принципе, регулярно копировал файлы. Но не всё.

Попробовал photorec. Быстренько так! Но. Хм, помнится undelete под ДОСом для FATа просил указать только первую букву, т.к. она и затиралась при удалении для отметки этого процесса (ЕМНИП). photorec придумал какие-то свои числовые номера. Отчего?

Зато он сохранил время создания. Но только фоток, а видео mp4 - нет. Он что EXIF для этого использовал, а не атрибуты с ФАТа? Не помню, они там действительно потираются?

И самое интересное: сравнил оригинальные (прежде переписанные) файлы с восстановленными. Размер отличается. photorec сделал их на 16% компактней. При этом конверт в bmp подтверждает, что это одна и та же картинка. Так это теперь перед тем как переписывать файлы с фотика, их надо сначала удалить, а затем восстанавливать, т.к. даёт экономию места, или в чём дело?

 , , , ,

gag
()

Процесс отладки ядра, отсылки и исправления патчей (истории успеха)

Сейчас ищу быстрый и удобный способ наладить этот процесс:

  • qemu/uml? (uml потенциально подходит, т.к. дело на данный момент не в драйвере);
  • минималистичный дистрибутив, где было бы удобно и быстро «переустанавливать» ядро, не засоряя систему;
  • git clone https://linux.org/... чтобы стянуть необходимый минимум (без истории, только linux-next);
  • оформление, отсылка патча;
  • что соблюдать, чтобы патч был принят/воспринят.

    Кто-нить реально проходил эти шаги до победного конца? Тогда поделитесь, пожалуйста, деталями.

 , , , ,

gag
()

RSS подписка на новые темы