在试图加快慢速代码时,最好遵循一种系统的方法。
首先,测量当前的性能。
接下来,做一些你认为会有帮助的改变。
最后,再测量一下,看看这个改变是否有效。
当涉及到调试缓慢的测试套件或部署时,也没有什么不同。
我最近注意到,我的Heroku部署需要花费近10分钟来构建。
感谢我的朋友Anthony给我的提示,我能够快速测量、诊断和部署一个修复方案,使Heroku的每次构建都减少了近4分钟。大赢家!
使用方法
Heroku使用 "buildpacks",它本质上是用于安装和配置服务器的shell脚本。
你可以添加多个构建包:对于Ruby on Rails应用来说,通常会有一个Ruby构建包(用于运行Rails应用)和一个Node构建包(用于构建Javascript资产)。
但是,即使你在改变代码部署的过程中观察构建日志,也没有太多的能力来了解过程中哪些部分是缓慢的。
输入heroku-buildpack-timestamps buildpack!
你可以把这个构建包添加到你的Heroku应用中,它将输出流程中每一步的时间戳:
2021-05-10 19:30:59
2021-05-10 19:30:59 -----> Creating runtime environment
2021-05-10 19:30:59
2021-05-10 19:30:59 NPM_CONFIG_LOGLEVEL=error
2021-05-10 19:30:59 YARN_PRODUCTION=true
2021-05-10 19:30:59 NODE_ENV=production
2021-05-10 19:30:59 NODE_MODULES_CACHE=true
2021-05-10 19:30:59 NODE_VERBOSE=false
2021-05-10 19:30:59
2021-05-10 19:30:59 -----> Installing binaries
2021-05-10 19:30:59 engines.node (package.json): unspecified (use default)
2021-05-10 19:30:59 engines.npm (package.json): unspecified (use default)
2021-05-10 19:30:59 engines.yarn (package.json): unspecified (use default)
2021-05-10 19:30:59
2021-05-10 19:30:59 Resolving node version 14.x...
2021-05-10 19:31:00 Downloading and installing node 14.17.0...
2021-05-10 19:31:01 Using default npm version: 6.14.13
2021-05-10 19:31:01 Resolving yarn version 1.22.x...
2021-05-10 19:31:01 Downloading and installing yarn (1.22.10)
2021-05-10 19:31:02 Installed yarn 1.22.10
2021-05-10 19:31:03
2021-05-10 19:31:03 -----> Restoring cache
2021-05-10 19:31:03 - node_modules
2021-05-10 19:31:05
2021-05-10 19:31:05 -----> Building dependencies
2021-05-10 19:31:06 Installing node modules (yarn.lock)
2021-05-10 19:31:07 yarn install v1.22.10
2021-05-10 19:34:10 Done in 191.01s.
2021-05-10 19:34:10
2021-05-10 19:34:10 -----> Caching build
2021-05-10 19:34:10 - node_modules
2021-05-10 19:34:17
2021-05-10 19:34:17 -----> Pruning devDependencies
2021-05-10 19:34:17 Skipping because YARN_PRODUCTION is 'true'
我把这个构建包添加到我的暂存Heroku应用中,并能够确定流程中的热点。我的发现表明,运行yarn install 需要4分钟,即使在两次构建之间没有Javascript的变化。
在确定了有问题的构建步骤后,我决定为yarn 打开--verbose 标志,看看为什么事情会这么慢。官方的nodejs 构建包应该自动缓存npm 包,所以每次构建都要花 4 分钟安装,这很奇怪。
--verbose 标志产生了大量的额外细节,以帮助我找到问题所在--超过23000行的日志......
Downloading binary from https://github.com/sass/node-sass/releases/download/v4.13.1/linux-x64-83_binding.node
Cannot download "https://github.com/sass/node-sass/releases/download/v4.13.1/linux-x64-83_binding.node":
HTTP error 404 Not Found
Hint: If github.com is not accessible in your location
try setting a proxy via HTTP_PROXY, e.g.
export HTTP_PROXY=http://example.com:1234
or configure npm proxy via
npm config set proxy http://example.com:8080
Building: /tmp/build_496d129f/.heroku/node/bin/node /tmp/build_496d129f/node_modules/node-gyp/bin/node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library=
深埋在日志中的是罪魁祸首。我们试图下载一个预编译的node-sass 二进制文件,但没有找到(因为Heroku运行的是Node 14,而我们要求的版本只为Node 10构建)。计时结束后,我们又手动建立了本地包。Aha!
(修复方法是更新webpacker )。
虽然这个修复是针对我的项目的,但这个过程是可以推广的:测量你的Heroku构建,找到缓慢的部分,然后深入挖掘,直到你能找到根本问题。
如果你发现自己一直在等待你的Heroku构建完成,试着添加这个构建包,这样你就可以调试它为什么慢。