--- Begin Message ---
Subject: |
[PATCH] derivations: Avoid readlink syscalls in read-derivation-from-file. |
Date: |
Fri, 17 Nov 2023 11:35:34 +0000 |
strace -c reports over 10,000 readlink syscalls when reading the derivation
for the hello package. By just setting the %file-port-name-canonicalization
fluid, this drops to less than 10.
I'm not sure if this actually improves performance, but doing less is surely
better.
* guix/derivations.scm (read-derivation-from-file): Set
%file-port-name-canonicalization to 'none when calling call-with-input-file.
Change-Id: I1ff16a059160576a576f2e9ed881379596e66af3
---
guix/derivations.scm | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/guix/derivations.scm b/guix/derivations.scm
index 9fec7f4f0b..e6ecb570c4 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -556,7 +556,12 @@ (define (read-derivation-from-file file)
;; and because the same argument is read more than 15 times on average
;; during something like (package-derivation s gdb).
(or (and file (hash-ref %derivation-cache file))
- (let ((drv (call-with-input-file file read-derivation)))
+ (let ((drv
+ ;; Avoid calling scm_i_relativize_path in
+ ;; fport_canonicalize_filename since this leads to lots of
+ ;; readlink calls
+ (with-fluids ((%file-port-name-canonicalization 'none))
+ (call-with-input-file file read-derivation))))
(hash-set! %derivation-cache file drv)
drv)))
base-commit: e35b7c5386c1bfacf47ed31bac9b503373dd26fc
--
2.41.0
--- End Message ---
--- Begin Message ---
Subject: |
Re: [bug#67238] [PATCH] derivations: Avoid readlink syscalls in read-derivation-from-file. |
Date: |
Sat, 25 Nov 2023 20:58:03 +0000 |
User-agent: |
mu4e 1.10.7; emacs 29.1 |
Ludovic Courtès <ludo@gnu.org> writes:
> Hi,
>
> Christopher Baines <mail@cbaines.net> skribis:
>
>> strace -c reports over 10,000 readlink syscalls when reading the derivation
>> for the hello package. By just setting the %file-port-name-canonicalization
>> fluid, this drops to less than 10.
>>
>> I'm not sure if this actually improves performance, but doing less is surely
>> better.
>>
>> * guix/derivations.scm (read-derivation-from-file): Set
>> %file-port-name-canonicalization to 'none when calling call-with-input-file.
>>
>> Change-Id: I1ff16a059160576a576f2e9ed881379596e66af3
>
> [...]
>
>> + (let ((drv
>> + ;; Avoid calling scm_i_relativize_path in
>> + ;; fport_canonicalize_filename since this leads to lots of
>> + ;; readlink calls
>> + (with-fluids ((%file-port-name-canonicalization 'none))
>> + (call-with-input-file file read-derivation))))
>
> This is already done in ‘run-guix’ in (guix ui), for all the ‘guix’
> commands (so this patch would be a slight performance regression for
> Guix itself).
>
> I’d suggest setting this fluid globally in applications that use Guix
> (the Build Coordinator, etc.), as is done in Guix itself.
>
> WDYT?
Ah, I didn't realise it was already set for Guix scripts. But yeah,
setting it in other places that read derivations makes sense.
signature.asc
Description: PGP signature
--- End Message ---