Skip to content

Instantly share code, notes, and snippets.

@ssig33
Created March 14, 2025 06:15
Show Gist options
  • Save ssig33/6e8658bd83ca9aef4eb7b1ac2b2b21d5 to your computer and use it in GitHub Desktop.
Save ssig33/6e8658bd83ca9aef4eb7b1ac2b2b21d5 to your computer and use it in GitHub Desktop.
#!/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