Nix-env suddenly got intolerably slow

I installed NicOS earlier today and for a while I was able to run nix-env --install in a reasonable time, but then the 5th time it suddenly started taking over 30 minutes. If I pass the --verbose option I can see it’s evaluating every file in /nix/store. I had edited the config and run nixos-rebuild switch a few times but only changing which desktop environment was enabled and changing the bootloader to grub.

I hadn’t done much in my home directory, and resetting all those changes doesn’t seem to have helped, but I’m pretty sure it’s the result of something I’ve done wrong rather than a bug because it didn’t happen the first few times.

Could I please have some advice for diagnosing the problem?

1 Like

Hi @quickdudley!

nix-env --install builds derivations and installs them, based on what matches the regex you passed in. A blank match means everything. You’re correct in that it is evaluating every file and that would explain the slowness.

Check out man nix-env-install for more. I’m sure most folks with tell you to avoid nix-env altogether but skim/reference/read that manual page nonetheless to get a better understanding.

1 Like

Oh I haven’t been running it with a blank regex I’ve been giving it exact package names and still seeing that behaviour.

Hmm that’s odd. Does collecting garbage help at all? nix-collect-garbage

nix-env without -A is very slow so use -iA, or preferably don’t use nix-env.

1 Like

stop-using-nix-env.privatevoid.net

That doesn’t explain why it suddenly changed, though. Did you stop using the -A flag? Did you run out of memory and the system is swapping?

1 Like

Now I think about it: the problem started when I started typing out my own invocations to nix-env rather than copying from the wiki, and I hadn’t been using the -A flag!

2 Likes

The important note is that, if you omit -A, nix-env will do so regardless of which regex you give it.

This is because without -A it uses the derivation name, rather than the name of its attribute in nixpkgs, so it needs to evaluate every single derivation to compute their names. This will take a lot of time if you don’t have much memory (~4GB is probably just about enough these days), and even a while with sufficient memory.

It also has other horrible implications, see the link I shared earlier.

3 Likes