-
-
Notifications
You must be signed in to change notification settings - Fork 14.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
nix-env uses a ton of memory #38635
Comments
Unfortunately Nix is not a simple package manager: it implements a lazy purely functional language, the evaluation of which uses a lot of memory. It has some design issues that make it hard to reduce memory usage (in particular the use of a monolithic Also, Nixpkgs has seen a lot of growth such that evaluation now takes > 3 times as much memory as two years ago (https://hydra.nixos.org/job/nixpkgs/trunk/metrics/metric/nix-env.qa.allocations). (This may also be a result of the use of certain new abstractions in Nixpkgs, e.g. |
When upgrading to NixOS 18.03 I had to add 6Gb swap on my laptop with 4Gb RAM to be able install some packages like KiCAD for example :( |
@katyo: I suspect your case is because there were no binaries for it, nix tried to build it locally, and |
@vcunat I already use distributed build a some time ago because my laptop not so much powerful. Also I relocated /tmp on a disk But it don't helps to reduce memory usage. |
@katyo: what kind of command do you use? If it's |
Ran into the same issue on a device with 8GB memory:
I also happened occasionally that my system simply started hanging out of the blue, which I suspect was caused by |
@eliasp: almost all people really want to prefer
so you just |
Also, Nixpkgs has seen a lot of growth such that evaluation now takes > 3 times as much memory as two years ago
This may also be a result of the use of certain new abstractions in Nixpkgs, e.g. `stdenv.mkDerivation` is a lot more complicated than two years ago.
I read changes of the significant bumps in that graph that were not immediately fixed several revisions later and all but the very last one were either changes to haskell packages or melpa. So my guess would be that we now have ~3x more packages in release.nix that two years ago, not that `stdenv.mkDerivation` became 3x slower.
The very latest bump is interesting, though, I'm not sure what causes it, it's either #44423 or #44517, bisecting now.
I think a much more useful metric would be "nix-env -qa avg allocations per result produced", not the absolute value.
|
@edolstra can you give a status update? are there plans to fix the design problems? Maybe is the effort with flakes related? This seem to be a big issue considering that the project should grow in terms of package count. |
@vcunat many thanks for the suggestion to use |
I am just getting started with nix and following the Nix manual.
I am experiencing the same issue on a freshly installed Nix (I did not install any packages, just followed the manual linked above). For more info:
I am running a 1GB RAM 1VCPU server. Does nix have minimum server requirements? If yes, what are they? P.S. I also run out of memory with commands for specific packages as well such as |
I'm not very experienced, but I think it's 3 GiB RAM nowadays (if not evaluating/building nix expressions remotely, i.e. run
P.S. |
Package managers shouldn't eat all the RAM there is. No other package managers eat as much trying to install packages. Not everyone wants to start from NixOS but try out Nix package management system and try to replace the current one but right now it get's OOM'ed trying to install several packages with 1.5GB of memory left (including swap). |
It because nix isn't an ordinary package manager. It's configuration philosophy. Of course it eats too much RAM in spite of lazy evaluation of nix expressions. This is serious issue which can stop I hope this problem can be (and should be) solved. May be special methods of caching can help to work around it (for example by splitting result of evaluation to hot/cold parts in RAM/disk respectively). |
Same goes for me when trying out nix with 2GB RAM, nix eats up half the memory while g++ taking only 20% of the memory, I wonder why it does not frees up memory for the compiler but takes it up itself, up to the point I have to quit firefox to fully build the application, I think this may be an issue in older raspberry pis. |
I am having this same issue with an 8GB laptop. When I run |
I marked this as stale due to inactivity. → More info |
I could be wrong, but from my experience if you every package pre-built and cached, and if you have 3GB or more of memory, you do not tend to run into this issue. |
Also, avoiding using |
@edolstra I'm curious about this, has Nix language garbage collection and its inefficient, or it was not implemented because it's inefficient? I mean, Haskell GHC have garbage collection and Haskell is also a lazy purely functional language, and I normally don't see this kind of problem with Haskell compiled programs. |
I said ineffective, not inefficient. Large circular data structures like |
@edolstra Just curious: Is there analysis of "the most evil packages" yet or any tooling to analyze dependencies semi-automatically? I have not seen links in the issue yet that go into direction of "fixing the cause of the problem". |
Got the same behaviour, tried I'm new to NixOS and learning it now. Honestly, the emergence of such problem with basic command after an hour of study is not what I expected. Otherwise, I very like the whole idea of NixOS but my confidence was shaken. |
Don't worry @nartamonov, I've been using Nix since for a while now and haven't had any major issues except for some rare out of memory events when building on my modest laptop. However, there are new features currently being developed that aim to improve performance, such as file deduplication, ca-derivations, and RFCs. |
Although officially considered unstable, I recommend |
I'm not familiar with Nix's memory model so I have no idea if this is theoretically possible and, if so, how much would have to change in Nix's code, but since Nix is a functional language, none of the evaluated expressions that are stuck in memory actually have to be kept around since they can always be recalculated, right? So, in case of low memory, is it possible to drop the least frequently referenced (or other heuristic) expressions from memory to free up space for what is currently needing the memory, and next time they are used, evaluate them again from scratch? Of course, this would come with decreased performance, but it would be better than running out of memory altogether. |
Zig master has now a declarative build system and handles user-provided memory limits (but not yet cgroups/lockdown for strict enforcing and graceful retries etc). |
I was thinking of using But like many people here Is there any way to limit the RAM usage of |
A simple work around is to just use a swap. Which can be done with a few commands. I do this all the time on a server with 0 issues. |
Yes, I could make it work with the I definitely have very little knowledge about the nix system as a whole so I'm unsure as to where the RAM usage is coming from. If it's linked to data structures within the nix programming language taking up too much RAM, could using sqlite and querying it instead of storing packages information in RAM help? Sorry if that's a stupid idea. |
On my VPS I define a toolset using an expression with For some things I actually fetch the build data from Hydra, and then do stuff by output path (not attribute or name), which won't work except via substituters, but as I am asking Hydra for what is the latest stuff available in the cache… |
Is it planned to fix this? |
I have been also running into this memory issue on a opensuse tumbleweed machine with nix installed. Installing packages worked using the |
@mdehollander nix-env is pretty much the worst in terms of anything, including memory usage, I think. If you want to use imperative package management, you could try nix profile, because it implements updates in a way that doesn't have to evaluate the entire nixpkgs and also isn't very fragile (nix-env stores packages as their package names instead of attr path which is not good since those don't have an index and aren't even necessarily unique). Otherwise, if you want to do declarative package management and don't want to use home manager, I suppose you could make an env yourself with pkgs.buildEnv along with a rebuild script to build the expression for it and link it to a known path. Then add its bin to the PATH environment. The expression might look something like this:
|
This issue has been mentioned on NixOS Discourse. There might be relevant details there: https://discourse.nixos.org/t/reduce-nix-env-u-memory-usage/37954/2 |
I'm also hitting this issue with nix-review, that uses nix-env under the hood… 11Gb of RAM used for a really basic package, even before compilation starts. Is there any alternative here or plans to fix this? |
Issue description
nix-env uses so much memory that it fails on allocation when querying packages; far more than should be for a simple package manager.
Steps to reproduce
On a system with 2gb or less:
Technical details
Please run
nix-shell -p nix-info --run "nix-info -m"
and paste theresults.
"x86_64-linux"
Linux 4.14.32, NixOS, 18.03.131807.489a14add9a (Impala)
yes
no
nix-env (Nix) 2.0
"nixpkgs-18.09pre134800.e42ae4e586c"
"nixos-18.03.131807.489a14add9a"
/nix/var/nix/profiles/per-user/root/channels/nixos/nixpkgs
The text was updated successfully, but these errors were encountered: