Created
March 14, 2025 06:15
-
-
Save ssig33/6e8658bd83ca9aef4eb7b1ac2b2b21d5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby | |
# frozen_string_literal: true | |
# MySQLとRedisのコネクション数を計算するスクリプト | |
# | |
# このスクリプトは、対話的にパラメータを入力してもらい、 | |
# 本番環境におけるMySQLとRedisのコネクション数を計算します。 | |
# 各コンポーネント(Webサーバー、各種ワーカー)の数は独立して変動することを前提としています。 | |
require 'readline' | |
# 対話的に数値を入力してもらう関数 | |
# @param prompt [String] 表示するプロンプト | |
# @param default [Integer] デフォルト値 | |
# @return [Integer] 入力された数値 | |
def ask_number(prompt, default = nil) | |
default_text = default ? " (デフォルト: #{default})" : "" | |
input = Readline.readline("#{prompt}#{default_text}: ", true) | |
# 入力が空の場合はデフォルト値を使用 | |
if input.strip.empty? && default | |
puts " → #{default} を使用します" | |
return default | |
end | |
# 数値に変換 | |
begin | |
number = Integer(input) | |
return number | |
rescue ArgumentError | |
puts " ⚠️ 数値を入力してください。もう一度試します。" | |
return ask_number(prompt, default) | |
end | |
end | |
puts "=== MySQL/Redisコネクション数計算ツール ===" | |
puts "各パラメータを入力してください。デフォルト値がある場合は、Enterキーを押すとそれが使用されます。" | |
puts | |
# Webサーバー関連のパラメータ | |
puts "【Webサーバー設定】" | |
web_servers = ask_number("Webサーバーのインスタンス数", 1) | |
puma_concurrency = ask_number("PUMA_WEB_CONCURRENCY(各Pumaインスタンスのワーカー数)", 2) | |
max_threads = ask_number("MAX_THREADS(各Pumaワーカーのスレッド数)", 5) | |
# ワーカープロセス関連のパラメータ | |
puts "\n【ワーカープロセス設定】" | |
puts "各ワーカータイプのインスタンス数を入力してください:" | |
worker_count = ask_number("worker(通常の非同期処理)", 1) | |
low_worker_count = ask_number("low_worker(商品マスタImport用)", 1) | |
high_worker_count = ask_number("high_worker(優先度の高い処理用)", 1) | |
top_worker_count = ask_number("top_worker(最優先の処理用)", 1) | |
univcoop_worker_count = ask_number("univcoop_worker(大学生協連携用)", 0) | |
monteroza_worker_count = ask_number("monteroza_worker(モンテローザ連携用)", 0) | |
scheduler_count = ask_number("scheduler(ジョブスケジューラ)", 1) | |
# 合計ワーカー数の計算 | |
total_workers = worker_count + low_worker_count + high_worker_count + | |
top_worker_count + univcoop_worker_count + monteroza_worker_count | |
# MySQL接続数の計算 | |
mysql_web_connections = web_servers * puma_concurrency * max_threads | |
mysql_worker_connections = total_workers | |
mysql_total_connections = mysql_web_connections + mysql_worker_connections | |
# Redis接続数の計算 | |
redis_web_connections = web_servers * puma_concurrency * max_threads | |
redis_worker_connections = total_workers | |
redis_scheduler_connections = scheduler_count | |
redis_total_connections = redis_web_connections + redis_worker_connections + redis_scheduler_connections | |
# 結果の表示 | |
puts "\n=== 計算結果 ===" | |
puts "\n【MySQL接続数】" | |
puts " Webサーバーからの接続数: #{mysql_web_connections}" | |
puts " (#{web_servers} Webサーバー × #{puma_concurrency} Pumaワーカー × #{max_threads} スレッド)" | |
puts " ワーカープロセスからの接続数: #{mysql_worker_connections}" | |
puts " 合計MySQL接続数: #{mysql_total_connections}" | |
# DATABASE_URLのpool設定に関する警告 | |
pool_size = 25 # DATABASE_URLのpool=25設定 | |
if mysql_web_connections > pool_size | |
puts " ⚠️ 警告: Webサーバーからの接続数(#{mysql_web_connections})がDATABASE_URLのpool設定(#{pool_size})を超えています。" | |
puts " 接続エラーが発生する可能性があります。pool設定の増加またはサーバー設定の調整を検討してください。" | |
end | |
puts "\n【Redis接続数】" | |
puts " Webサーバーからの接続数: #{redis_web_connections}" | |
puts " (#{web_servers} Webサーバー × #{puma_concurrency} Pumaワーカー × #{max_threads} スレッド)" | |
puts " ワーカープロセスからの接続数: #{redis_worker_connections}" | |
puts " スケジューラからの接続数: #{redis_scheduler_connections}" | |
puts " 合計Redis接続数: #{redis_total_connections}" | |
puts "\n注意: これらの数値は理論上の最大値です。実際の接続数は、同時に処理を行うプロセス数によって変動します。" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment