Yesterday, I deployed my latest administration dashboard to staging environment. The dashboard uses AngularJS, NodeJS and Bootstrap. It can be built by using Grunt, Bower, Npm and tested using Karma and PhantomJS.
However, after I had transfered my source onto staging machine, I am unable to perform
npm install. Command just freezes, and after 20 or 30 minutes, npm displays Killed message and breaks.
I had tried several ways:
npm installwith every single dependency in package.json (about 20 dependencies, mostly grunt related)
- remove ^ and ~ character in package.json to ensure npm only fetches correct version of dependencies (no need to compare and get latest version)
- note that
bower installcan perform normally with about ~10 dependencies of AngularJS
npm rm -rf node_modules && npm cache clean, then npm install again does not work too, npm still be killed
Prevent npm install from being Killed
Hmm, then I search around Internet, and people rise this issue mostly by dirty workspace of node modules, and cleaning cache is enough. However, other people, like me, still faces this issue without luck. Because my local machine can run the commands without problem, and the remote machine has same environment, then the different is only about machine configuration.
- My local machine: dual core 1.3Ghz, with 4GB RAM and 4GB swap file, 256GB SSD
- My remote machine: single core CPU, with 512MB RAM and 20GB SSD
npm installwas Killed, after laggy (|) rotation
So the biggest differ is memory, I can think my remote machine (which is running Apache, nginx and MySQL) has not enough memory for npm to build something while installing dependencies – several dependencies need to be rebuilt by make.
I go to check my swap file in remote machine:
sudo swapon -s
Then result is no swap file are available:
Filename Type Size Used Priority
I tried to create a 1GB swap file (on SSD system, swap speed can be much faster)
sudo dd if=/dev/zero of=/swapfile bs=1024 count=1024k
sudo mkswap /swapfile
sudo swapon /swapfile
Persist swap file after reboot by copying configuration on to
sudo nano /etc/fstab
/swapfile none swap sw 0 0
Make swap file to be a buffer to prevent application crashes:
echo 10 | sudo tee /proc/sys/vm/swappiness echo vm.swappiness = 10 | sudo tee -a /etc/sysctl.conf
Finally, set correct permission on it:
sudo chown root:root /swapfile sudo chmod 0600 /swapfile
Now, clean cache and rebuild with npm:
npm cache clean npm install
And voila! Install script works perfectly. It took about 5 minutes for npm and make to build and install needed dependencies. Then I can npm start and my dashboard is now online!
So, the conclusion is: when you already had success at something, then you fail with the same task, please look at what is different, including software and hardware to find out the reason of failure. Next time I use a VPS, I will make sure that swap file is available right after initial configuration.