`npm uninstall`挂起(或很慢)没有明显的活动

时间:2015-05-13 18:15:34

标签: linux node.js npm rmdir openafs

我总是发现npm uninstall需要花费相当长的时间才能排除故障。我在25分钟前开始卸载四个软件包,它似乎停滞不前,没有任何进展,没有显着的CPU活动,也没有明显的磁盘活动(使用iotop)。我对此问题感到茫然。

这是当前输出(匿名),其loglevel为'silly':

$ npm uninstall --save-dev -ddd gulp-autoprefixer gulp-sass gulp-sequence gulp-sourcemaps
npm info it worked if it ends with ok
npm verb cli [ '/path/to/home/bin/node-v0.12.2-linux-x64/bin/node',
npm verb cli   '/path/to/home/bin/node-v0.12.2-linux-x64/bin/npm',
npm verb cli   'uninstall',
npm verb cli   '--save-dev',
npm verb cli   '-ddd',
npm verb cli   'gulp-autoprefixer',
npm verb cli   'gulp-sass',
npm verb cli   'gulp-sequence',
npm verb cli   'gulp-sourcemaps' ]
npm info using npm@2.7.4
npm info using node@v0.12.2
npm verb unbuild node_modules/gulp-autoprefixer
npm verb unbuild node_modules/gulp-sass
npm verb unbuild node_modules/gulp-sequence
npm verb unbuild node_modules/gulp-sourcemaps
npm sill gentlyRm /path/to/home/myproject/node_modules/gulp-autoprefixer is being purged from base /path/to/home/myproject
npm verb gentlyRm don't care about contents; nuking /path/to/home/myproject/node_modules/gulp-autoprefixer
npm sill gentlyRm /path/to/home/myproject/node_modules/gulp-sass is being purged from base /path/to/home/myproject
npm verb gentlyRm don't care about contents; nuking /path/to/home/myproject/node_modules/gulp-sass
npm sill gentlyRm /path/to/home/myproject/node_modules/gulp-sequence is being purged from base /path/to/home/myproject
npm verb gentlyRm don't care about contents; nuking /path/to/home/myproject/node_modules/gulp-sequence
npm sill gentlyRm /path/to/home/myproject/node_modules/gulp-sourcemaps is being purged from base /path/to/home/myproject
npm verb gentlyRm don't care about contents; nuking /path/to/home/myproject/node_modules/gulp-sourcemaps
npm sill vacuum-fs purging /path/to/home/myproject/node_modules/gulp-autoprefixer
npm sill vacuum-fs purging /path/to/home/myproject/node_modules/gulp-sass
npm sill vacuum-fs purging /path/to/home/myproject/node_modules/gulp-sequence
npm sill vacuum-fs purging /path/to/home/myproject/node_modules/gulp-sourcemaps

......自从我开始它之后不久,它就一直停滞不前。早期尝试一次删除一个包,但仍然在vacuum-fs步骤停留了一段时间(约30秒)。我在具有8 GB内存,Node v0.12.2和npm 2.7.4的四核Intel i5上运行Ubuntu 14.04 LTS。

有谁知道问题可能是什么或如何进一步排除故障?

(顺便说一下,我不确定这是否是适合工具问题的StackExchange网站,所以如果不是,请另外推荐!)

编辑:我根据@ dekkard的答案使用strace进行了一些调查;这里是减速发生区域的摘录(以strace -f -t -o out.log npm uninstall -D gobble为例):

...
18327 17:00:52 rmdir("/path/to/home/myproject/node_modules/gobble/node_modules/minimatch" <unfinished ...>
18318 17:00:52 read(8, "\1\0\0\0\0\0\0\0", 1024) = 8
18318 17:00:52 epoll_wait(5,  <unfinished ...>
18325 17:00:55 <... rmdir resumed> )    = -1 ENOTEMPTY (Directory not empty)
18325 17:00:55 write(8, "\1\0\0\0\0\0\0\0", 8) = 8
18325 17:00:55 rmdir("/path/to/home/myproject/node_modules/gobble/node_modules/mkdirp" <unfinished ...>
18318 17:00:55 <... epoll_wait resumed> {{EPOLLIN, {u32=8, u64=8}}}, 1024, -1) = 1
18318 17:00:55 read(8, "\1\0\0\0\0\0\0\0", 1024) = 8
18318 17:00:55 epoll_wait(5,  <unfinished ...>
18328 17:00:58 <... rmdir resumed> )    = -1 ENOTEMPTY (Directory not empty)
18328 17:00:58 write(8, "\1\0\0\0\0\0\0\0", 8) = 8
18318 17:00:58 <... epoll_wait resumed> {{EPOLLIN, {u32=8, u64=8}}}, 1024, -1) = 1
18328 17:00:58 rmdir("/path/to/home/myproject/node_modules/gobble/node_modules/promise-map-series" <unfinished ...>
18318 17:00:58 read(8, "\1\0\0\0\0\0\0\0", 1024) = 8
18318 17:00:58 epoll_wait(5,  <unfinished ...>
18326 17:01:01 <... rmdir resumed> )    = -1 ENOTEMPTY (Directory not empty)
18326 17:01:01 write(8, "\1\0\0\0\0\0\0\0", 8) = 8
18318 17:01:01 <... epoll_wait resumed> {{EPOLLIN, {u32=8, u64=8}}}, 1024, -1) = 1
...

在控制台中实时查看时,每个epoll_wait(5,与任何后续输出之间会有约3秒的停顿。想法?

2 个答案:

答案 0 :(得分:3)

为了将来参考,根本问题是以下两件事的组合:

  1. 节点rimraf模块(由npm和许多其他软件包使用)通过首先尝试删除目录来操作,并且仅在rmdir错误时才读取其内容{ {1}}(请参阅this line in the rimraf source)。

  2. 我的项目文件夹位于AFS卷上,默认情况下,似乎AFS文件服务器会限制客户端连续发出过多失败的RPC(对于MIT's Student Information Processing Board的人员来说,指出这一点通过电子邮件)。具体来说,默认值会连续超过10个RPC失败,造成3秒延迟。

  3. 最终结果是ENOTEMPTY和依赖它的软件包在AFS卷上的爬行速度变慢,至少在我的机器上......虽然似乎有一些操作系统优化至少可以一些在命中文件服务器之前的早期命令错误(例如http://milek.blogspot.com/2014/01/mkdir-performance.html),基于上面的日志,我的系统rimraf似乎没有发生这种错误。

    我在这里打开了rmdir个问题:https://github.com/isaacs/rimraf/issues/73

答案 1 :(得分:1)

我建议您找到npm uninstall的PID并通过straceltrace附加到<{1}}:

strace -c -p <PID>

http://linux.die.net/man/1/strace

  

-c
  计算每个系统调用的时间,调用和错误,并报告程序退出的摘要

此外,您可以过滤跟踪调用(即文件,网络,信号等)

<强>更新

  

18318 17:00:52 epoll_wait(5, <unfinished ...>

您可以尝试向后滚动,找到返回epoll_create() == 5 epollfd来电,稍后会将其传递给epoll_wait()。检查周围的呼叫可能会提供一些线索。