From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Fri, 11 Nov 2022 17:08:53 +0100 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1otWaL-004OSZ-KV for lore@lore.pengutronix.de; Fri, 11 Nov 2022 17:08:53 +0100 Received: from localhost ([127.0.0.1] helo=metis.ext.pengutronix.de) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1otWaK-0007Ib-16; Fri, 11 Nov 2022 17:08:52 +0100 Received: from ptx.hi.pengutronix.de ([2001:67c:670:100:1d::c0]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1otWZq-0007IP-6a; Fri, 11 Nov 2022 17:08:22 +0100 Received: from mol by ptx.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1otWZp-0006Yx-Ji; Fri, 11 Nov 2022 17:08:21 +0100 Date: Fri, 11 Nov 2022 17:08:21 +0100 From: Michael Olbrich To: Christian Melki Message-ID: <20221111160821.GG27612@pengutronix.de> Mail-Followup-To: Christian Melki , post@lespocky.de, CG@eks-engel.de, ptxdist@pengutronix.de References: <75f0b7f568884d33af8f5c6bc23bd5dd@eks-engel.de> <2aa3b38a-9025-d88e-8364-fea4ada10f3a@t2data.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-Sent-From: Pengutronix Hildesheim X-URL: http://www.pengutronix.de/ X-Accept-Language: de,en X-Accept-Content-Type: text/plain User-Agent: Mutt/1.10.1 (2018-07-13) Subject: Re: [ptxdist] Speed up targetinstall of certain packages X-BeenThere: ptxdist@pengutronix.de X-Mailman-Version: 2.1.29 Precedence: list List-Id: PTXdist Development Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: ptxdist@pengutronix.de Cc: post@lespocky.de, ptxdist@pengutronix.de, CG@eks-engel.de Sender: "ptxdist" X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: ptxdist-bounces@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false Hi, On Tue, Nov 08, 2022 at 01:10:32PM +0100, Christian Melki wrote: > So I did an experiment with bash loadables (builtins). > Turns out bash has a bunch of builtin examples. > > I had ptxdist build me a bash-5.2 for x86_64. > With the "loadables" make target. > > $ diff -urN ../lib/ptxdist-2022.11.0/rules/bash.make rules/bash.make > --- ../lib/ptxdist-2022.11.0/rules/bash.make 2022-10-21 16:54:50.000000000 +0200 > +++ rules/bash.make 2022-11-08 12:51:38.609794625 +0100 > @@ -77,6 +77,16 @@ > --$(call ptx/wwo, PTXCONF_BASH_CURSES)-curses > # ---------------------------------------------------------------------------- > +# Compile > +# ---------------------------------------------------------------------------- > + > +$(STATEDIR)/bash.compile: > + @$(call targetinfo) > + @$(call world/compile, BASH) > + @$(call compile, BASH, loadables) > + @$(call touch) > + > +# ---------------------------------------------------------------------------- > > Since mkdir is slightly less than half of the external binary calls I had it replaced. > I copied the scripts/lib/ptxd_make_xpkg_pkg.sh to my build path > and created a shell-loadables directory there. > > $ cp platform-secplatform-x86_64/build-target/bash-5.2/examples/loadables/mkdir scripts/lib/shell-loadables/ > > $ ls -1 scripts/lib/shell-loadables/ > mkdir > > $ diff -urN ../lib/ptxdist-2022.11.0/scripts/lib/ptxd_make_xpkg_pkg.sh scripts/lib/ptxd_make_xpkg_pkg.sh > --- ../lib/ptxdist-2022.11.0/scripts/lib/ptxd_make_xpkg_pkg.sh 2022-10-21 16:54:50.000000000 +0200 > +++ scripts/lib/ptxd_make_xpkg_pkg.sh 2022-11-08 13:08:18.074550829 +0100 > @@ -682,6 +682,8 @@ > ptxd_install_file() { > local cmd="file" > + #export PS4='+[${EPOCHREALTIME}][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x; > + enable -f scripts/lib/shell-loadables/mkdir mkdir > ptxd_install_file_impl "$@" || > ptxd_install_error "install_file failed!" > } > > without mkdir builtin: > finished target timezone.targetinstall.post > > real 0m17,043s > user 0m13,522s > sys 0m4,138s > > with mkdir builtin: > finished target timezone.targetinstall.post > > real 0m12,345s > user 0m9,899s > sys 0m2,916s So loadable builtins in bash is interesting, but not something we can rely on at this time. But this whole thing got me thinking. Most mkdirs are don't actually do anything. They are just in case the directory does not exist yet. So we can do that: if [ ! -d "${dir}" ]; then mkdir -p "${dir}" fi That avoid most of the mkdirs and the speedup is considerably. Similar to the builtin I think. And I found some more things to improve: The 'flock' is only needed when building packages in parallel, so we can skip it for things like "ptxdist drop foo.compile; ptxdist targetinstall foo", and that's where the slow targetinstall hurts the moset. Do the chmod/chown with the 'install' when possible. And some stuff to improve the ptxdist startup time. For "time ptxdist targetinstall timezone" I get: Before: real 0m29.167s user 0m19.389s sys 0m9.903s After: real 0m8.887s user 0m5.954s sys 0m2.470s This stuff should hit master pretty soon. Thanks for the inspiration :-). Michael > On 11/8/22 11:13 AM, Christian Melki wrote: > > > > > > On 11/4/22 8:12 PM, Alexander Dahl wrote: > > > Hello Christian, > > > > > > Am Fri, Nov 04, 2022 at 03:37:02PM +0000 schrieb Gieseler, Christian: > > > > Hello, > > > > > > > > I have question regarding the speedup of daily work. > > > > > > > > We have frontend and backend of our webgui deployed with separate packages. Only task of these package is to deploy the files with > > > > > > > > @$(call install_tree, web-frontend, -, -, $(WEB_FRONTEND_DIR)/var-www/, /var/www/,no) > > > > > > > > Compile and install stages are empty. The just call targetinfo and touch to skip the stages. > > > > > > > > The frontend depends on the backend and the backend obviously depends on our application which is called by the backend. > > > > So our web-frontend.in file looks like this: > > > > ## SECTION=project_specific > > > > > > > > config WEB_FRONTEND > > > >     bool > > > >     select APP_LAYER > > > >     select WEB_BACKEND > > > >     prompt "e-mode Web Frontend" > > > >     help > > > > > > > > As expected if i clean and compile APP_LAYER the targetinstallstage of Backend and Frontend are executed again. However this is only a Run-Time only dependency. It is a third-party archive and install_tree takes quite some time even on fast build hosts. Even it if is just a minute it is annoying to spend the time waiting during image creation. Trying to solve that i found "if RUNTIME"  für Run-Time only Dependencys in the documentation here: > > > > > > > > https://www.ptxdist.org/doc/daily_work_section.html#controlling-package-dependencies-in-more-detail > > > > > > > > So my expectation would be that if i change the webfrontend.in file like this: > > > > > > > > config WEB_FRONTEND > > > >     bool > > > >     select APP_LAYER    if RUNTIME > > > >     select WEB_BACKEND   if RUNTIME > > > >     prompt "e-mode Web Frontend" > > > >     help > > > > > > That sounds reasonable and I would have done it the same. > > > > > > > The "if RUNTIME" would make sure that the targetinstall stage is not executed again if i just execute a "ptxdist clean app-layer" followed by a "ptxdist images". Same with ptxdist clean root; ptxdist images. It is clear that all targetinstall stages are executed again, but i would expect that the web-frontend is deployed earlier if no build dependency is given. > > > > > > > > Am i missing something, oder is the "if RUNTIME" Switch not working properly in my ptxdist-2018.12 version? Or does it have no effect on targetinstall stages? > > > > > > Not sure how that should behave.  However if you want to speed up the > > > build: make sure you call ptxdist with -q or --quiet parameter.  The > > > output on screen takes suprisingly much time, even with modern > > > terminals, and especially when doing targetinstall of many many files > > > (as usually the case with web frontends. been there, done that.) > > > > > > Greets > > > Alex > > > > > > > I have a slight disagreement here. I don't think the console is slow. > > So I did some investigation, mostly since the slowness bugs me too. > > I did a: > > export PS4='+[${EPOCHREALTIME}][${BASH_SOURCE}:${LINENO}]: ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'; set -x; > > as time measurement and trace in the shellscript in question (mostly scripts/lib/ptxd_make_xpkg_pkg.sh). > > This pretty linear progressive cpu consumption, albeit the big chunks were due to calling of external binaries. > > > > Then I did a timezone package clean and targetinstall. > > When targetinstalling a zone there was calls to several binaries. > > > > For one zone I had external calls to (in order): > > echo, mkdir, printf(?), flock, ls, rm, mkdir, flock, mkdir, flock, mkdir, flock, mkdir, flock, mkdir, flock, mkdir, mkdir, mkdir, mkdir, mkdir, install, install, chmod, chmod, chown, echo. > > > > Some of these could be internal builtins, but the consumed time suggested otherwise. > > Either way. Each install took about 26 ms and I could account the majority of that time in forking external programs and waiting for them to return. > > > > So my conclusion is: The whole thing is a bit slow and bash doesn't help. > > > > Regards, > > Christian > > > > > > > > > > Thanks for any feedback. > > > > BR, > > > > Christian > > > > > > > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |