CORESERVERでThreadPoolBuildErrorが出た場合の対処法

#Astro#JavaScript#Node.js#TypeScript#Web開発#プログラミング#解説
投稿日:

はじめに

このブログは現在、Cloudflare Pagesの無料枠とAstroを使って構築しています。しかし、ページ数が増えるにつれてビルド時間が長くなってきたので、ビルド時の環境構築やビルド成果物のアップロードにかかる時間をなくすために、CORESERVERの導入を検討しています。

実際に導入する前にCORESERVERの30日間無料体験で試してみたところ、後述のエラーによってOGP画像の自動生成が失敗することが判明しました。今回は、その対処法について紹介します。

エラー内容

Astroのビルド中に次のようなエラーが発生しました。具体的には、OGP画像の自動生成に使用しているSatoriの内部でエラーが発生していると思われます。

Terminal window
thread '<unnamed>' panicked at src/index.crates.io-6f17d22bba15001f/rayon-core-1.12.1/src/registry.rs:168:10:
The global thread pool has not been initialized.: ThreadPoolBuildError { kind: IOError(Os { code: 11, kind: WouldBlock, message: "Resource temporarily unavailable" }) }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Aborted (core dumped)

エラーメッセージを読むと、Rustの並列処理ライブラリーであるRayonの処理中にエラーが発生しているようです。

Next.jsで同様のエラーが発生した場合は、swcMinifyfalseに設定することで解決するという記事がいくつかありました。しかし、私の場合はNext.jsではなくAstroを使っているため、この対処法は使えません。

解決方法

しばらくインターネットをさまよっていたところ、こちらのDiscussionsを見つけました。

内容としては簡単で、環境変数にRAYON_NUM_THREADS=1を設定すれば解決できるというものです。

これを試してみると、エラーが解消されました。CORESERVERはLinuxなので、exportコマンドを使って環境変数を設定します。

Terminal window
export RAYON_NUM_THREADS=1

手元の環境では、RAYON_NUM_THREADS=64でも問題なく動作しました。CORESERVERの仕様が最大64コアとなっていたので、それに合わせた数値を設定しました。64でも引き続きエラーが出る場合は、数値を減らしてみてください。

Twitterのアイコン LINEのアイコン Threadsのアイコン Misskeyのアイコン Misskeyのアイコン
著者のアイコン画像

生まれた時から、母国語よりも先にJavaScriptを使っていました。ネットの海のどこにもいなくてどこにでもいます。

Webフロントエンドプログラマーで、テクノロジーに関する話題を追いかけています。動画編集やプログラミングが趣味で、たまにデザインなどもやっています。主にTypeScriptを使用したWebフロントエンド開発を専門とし、便利で実用的なブラウザー拡張機能を作成しています。また、個人ブログを通じて、IT関連のニュースやハウツー、技術的なプログラミング情報を発信しています。