sonatype nexus3 の s3 blobstore は rubygems では遅くなった話

タイトルがすべてを物語っていますが、

sonatype nexus3 とは、パッケージマネージャです。

maven, rubygem, pypi, npm, docker など、各種言語などのパッケージマネージャを主に内部向けに公開するのに使えるものです。

最近だとgithubなどもパッケージを置けるようになって存在意義が薄れてきているのかな?というきもしますが。

で、各種パッケージを保管する場所が必要になりますが、通常、サーバ上のファイルシステムがその保管場所として利用されます。

nexus3では、サーバ上のファイルシステムのほか、AWS S3 も保管場所として利用できます。オフィシャルサイトにも、EC2でnexus3を動かすのでないかぎり、推奨しないと書かれていますが。

なにはともあれ、EC2でnexus3を動かしていたので、S3をストレージとして利用していたところ、

「bundle install すると前は10秒くらいで終わっていたのが2-3分かかるようになったんだけど」

などと連絡を受け、ストレージ変更のほかに構成変更を行っていたのでそこが原因かも、と疑い、いろいろ設定変更したりしたのですが、ファイルシステムをストレージとして利用したところ、高速化し、原因が判明したという流れです。

ではなぜS3にすると遅くなるのでしょうか。それはおそらく、依存関係解決のためです。

Gemfileには、まず、直接依存しているパッケージ群が記載されています。

まず、それらのパッケージについて、どのパッケージに依存しているのかをnexus3に問い合わせます。

すると、nexus3は、各パッケージの依存関係が記載されたファイルを取得します。結果、s3からのファイルダウンロードがパッケージの数だけ走ります。

nexus3から、依存先のパッケージ一覧が返ってきます。

新しく見つかったパッケージについて、またどのパッケージに依存しているのかをnexus3に問い合わせます。

というのを、全パッケージについて行いますので、s3からファイルをダウンロードする回数がそこそこ多くなり、そのぶん時間が余計にかかる。という話です。

EC2で運用してこれなので、AWSからネットワーク的に遠いところでS3をストレージとして利用すると、目も当てられないような遅さになるのではないかと推測できます。