ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Anton Zhukharev <ancieg@altlinux.org>
To: ALT Linux Team development discussions <devel@lists.altlinux.org>
Subject: Re: [devel] racket cpu hog (was: CPU time limit exceeded)
Date: Wed, 26 Oct 2022 22:47:25 +0300
Message-ID: <Y1mOzQ8+r2+asYrJ@dell-vostro-5301> (raw)
In-Reply-To: <Y1ZEqVuEbTzEEci8@dell-vostro-5301>

[-- Attachment #1: Type: text/plain, Size: 10938 bytes --]

On Mon, Oct 24, 2022 at 10:54:17AM +0300, Anton Zhukharev wrote:
> On Sun, Oct 23, 2022 at 09:52:39PM +0300, Anton Zhukharev wrote:
> > On Sun, Oct 23, 2022 at 08:25:05PM +0300, Dmitry V. Levin wrote:
> > > On Sun, Oct 23, 2022 at 12:39:16PM +0300, Anton Zhukharev wrote:
> > > > Добрый день!
> > > > 
> > > > Недавно столкнулся с проблемой следующего вида:
> > > > 
> > > > [ppc64le] /usr/sbin/chroot.fakechroot: line 147: 2435617 CPU time limit exceeded env -u FAKECHROOT_BASE_ORIG FAKECHROOT_CMD_ORIG= LD_LIBRARY_PATH="$fakechroot_chroot_paths" FAKECHROOT_BASE="$fakechroot_chroot_base" "$fakechroot_chroot_chroot" "${@:1:$(($fakechroot_chroot_n - 1))}" "$fakechroot_chroot_final_newroot" "${@:$(($fakechroot_chroot_n + 1))}"
> > > > 2022-Oct-22 21:18:00 :: [ppc64le] racket-main-distribution.git 8.6-alt1: remote: build failed
> > > > 2022-Oct-22 21:18:00 :: [ppc64le] #100 racket-main-distribution.git 8.6-alt1: build FAILED
> > > > 
> > > > в задании 308872.
> > > > 
> > > > Насколько я понимаю, эта ошибка связана с разделением времени работы
> > > > процессора между пользовательскими процессами (воспроизвелась только на
> > > > архитектурах i586, armh и ppc64le - на x86_64 и aarch64 полёт нормальный).
> > > > 
> > > > Есть способ обхода такого ограничения?
> > > 
> > > Сделать так, чтобы racket перестал быть таким неуёмно прожорливым,
> > > что особенно проявляется на более медленных архитектурах.
> > > 
> > Это, конечно, не лучшее решение, но сделав установку Racket-пакетов в
> > 1 поток (-j 1), пакет стал собираться (см. задание 308872).
> > 
> > Похоже, что планировщик в установщике пакетов Racket'а работает не очень
> > оптимальным образом.
> > 
> > Что ж, решение найдено. Процесс сборки стал дольше (кстати, не сильно),
> > однако мне важен результат, а не скорость.
> > 
> > Осталось подлатать и в репозитории будет Racket ;).
> > 
> К сожалению, я поспешил с выводами. Этот способ помог только на i586.
> 
> Похоже, что придётся дробить (хотелось этого избежать для пакетов
> входящих в main-distribution, однако придётся как-то решить проблему
> взаимозависимостей).

Дальше много текста, предлагается читать только тем, кому интересна идея
о возвращении в репозиторий Racket (именно современного CS-варианта).

--

Похоже, что раздробить всё таки легко не получится: сейчас попробую "вкраце"
объяснить почему это довольно сложно в случае с Racket.

Основная проблема заключается в том, что после установки каждого пакета
Racket вносит данные в файл links.rktd (/usr/share/racket/links.rktd),
который содержит ссылки на пакеты (по одному на строку) и ещё
дополнительные данные. Это только половина беды, поскольку решается
(вроде бы) выполнением команды:

    # raco link -i --repair

Дальше - ещё веселее. Также _необходим_ файл pkgs.rktd
(/usr/lib/racket/pkgs/pkgs.rktd), который необходим практически
для того же для чего нужен и links.rktd (он содержит ссылки на пакеты).
Он также обновляется после каждой установки/обновлении пакета. Если этот
файл повредится/будет удалён/недоступен, то пакетный менеджер raco не
увидит, что в системе установлены Racket-пакеты (в /usr/lib/racket/pkgs)

В теории, это можно решить созданием независимого пакета, который будет
содержать список со всеми пакетами из main-distribution (однако как его
обновлять в дальнейшем - не совсем ясно: если кому-то понадобится
установить Racket-пакет не входящий в RPM-пакет, то он должен
быть (1) установлен от пользователя root, (2) он изменит файл, который
принадлежит теоретическому независимому пакету (это, на мой взгляд не
совсем правильно) и (3) будет конфликтовать с другими возможными
пакетами с Racket-пакетами).

Аналогично файлу pkgs.rktd также существуют два файла в
/usr/lib[64]/racket: это launchers.rktd и mans.rktd, которые также
изменяются после установки _некоторых_ пакетов из main-distribution.
Они содержат запускаторы для программ, которые являются Racket-пакетами,
и man-pages соответственно.

Обновлять файлы pkgs.rktd, launchers.rktd и mans.rktd, возможно,
получится в будущем, когда я (или не я) разберусь с кодовой базой Racket
и создам свой велосипед для их актуализации. Но даже если такой
велосипед будет создан, то не понятно когда его запускать: после
установки каждого RPM-пакета с Racket-пакетами выглядит неоптимально,
поскольку в теории может быть вызвано несколько раз, допустим при
обновлении пакетов или их установки, что сильно увеличит длительность
транзакции установки пакетов. Тут мне нужна помощь: существует ли
возможность выполнения определенного скриптлета 1 раз в конце
транзакции? Ну, допустим есть ли что-то вроде "%post --once"?
// Ну или диагонально-другая идея: создать systemd-сервис, который
// будет после обновления пакетов проводить операции актуализации
// этих файлов. Здесь нужно ещё думать.

Сейчас у меня на уме несколько идей, которые нуждаются в, как минимум,
первичных обсуждениях дабы возможные пользователи Racket не испытывали
дискомфорт при использовании его из нашего репозитория:

    1. Оставить только RPM-пакет racket-core, а пользователей "обязать"
       ставить Racket-пакеты себе в домашнюю директорию. (не нравится, к
       тому же не работает, поскольку сейчас в репозитории Racket 8.6, а
       пакетный менеджер raco пытается ставить пакеты для 8.7, который
       ещё в стадии тестирования...)

    2. Выкинуть архитектуры ppc64le и armh и собирать Racket-пакеты из
       main-distribution в один RPM-пакет. (ещё больше не нравится из-за
       отказа от некоторых платформ в нашем репозитории)

    3. Попробовать ставить Racket-пакеты из main-distribution в систему,
       используя EEPM (использовать racket-core из репозитория и просто
       устанавливать Racket-пакеты в рамках локальной сборки на каждой
       пользовательской машине). (нравится, поскольку пакеты будут
       установлены в system-scope, не нужно отказываться от некоторых
       платформ, а процесс сборки надёжен, поскольку у него небольшие
       требования - разве что CPU time)

    4. "Завелосипедить" свой установщик Racket-пакетов для ALT'а (я в
       восторге от этого варианта, но на его реализацию потребуется
       неопределенное количество времени).

Если кому-то интересно о "возможных пользователях Racket", то они могут
появиться после приобретения книги "Как проектировать программы":

    Фелляйзен М., Финдлер Р.Б., Флэтт М.[1], Кришнамурти Ш.
    Как проектировать программы / пер. с англ. А.Н. Киселева; под ред.
    П.Б. Иванова, А.Д. Чичинина, Ю.А. Сыровецкого, С.В. Бронникова. -М:
    ДМК Пресс, 2022. - 724 с.: ил.

    Сайт книги: http://htdp.org/2022-8-7/Book/index.html

Конечно, таких пользователей может оказаться немного, однако это
неплохой случай занять эту небольшую нишу в области образования.

--
[1] - Флэтт М. (он же mflatt) - главный разработчик Racket (по
совместительству его создатель).

-- 
С уважением,
Жухарев Антон

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2022-10-26 19:47 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-23  9:39 [devel] CPU time limit exceeded Anton Zhukharev
2022-10-23 12:33 ` Leonid Krivoshein
2022-10-23 16:32   ` Anton Zhukharev
2022-10-23 18:51     ` Andrey Savchenko
2022-10-23 18:56       ` Anton Zhukharev
2022-10-23 17:25 ` [devel] racket cpu hog (was: CPU time limit exceeded) Dmitry V. Levin
2022-10-23 18:52   ` Anton Zhukharev
2022-10-23 19:05     ` Vitaly Chikunov
2022-10-23 19:37       ` Anton Farygin
2022-10-24  7:47         ` Anton Zhukharev
2022-10-24  7:54           ` Anton Farygin
2022-10-24 10:33           ` Andrey Savchenko
2022-10-24 11:00             ` Vitaly Chikunov
2022-10-24 12:09               ` Dmitry V. Levin
2022-10-24 12:19                 ` Sergey V Turchin
2022-10-24  7:54     ` Anton Zhukharev
2022-10-26 19:47       ` Anton Zhukharev [this message]
2022-10-26 20:42         ` Ivan A. Melnikov
2022-10-27  6:47         ` Anton Farygin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Y1mOzQ8+r2+asYrJ@dell-vostro-5301 \
    --to=ancieg@altlinux.org \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git