бот с расписанием пар на Sinatra + SQLite, в марте переселил его с ноутбука на самый дешёвый VPS за 550 ₽, 1 ядро и 1 ГБ. puma стартует с конфигом из какого-то гайда на 4 воркера, и сервер уходит в swap. сколько вообще надо? делал для своей группы, а теперь им пользуется весь поток, человек 200, пишут в основном утром, пока все едут к девяти в Петергоф на пары
На одно ядро и 200 человек воркеры не нужны совсем: запускай Puma в одиночном режиме и несколько потоков. Каждый воркер это отдельный процесс со своей памятью, у тебя их четыре по 80-100 МБ плюс мастер. Примерно так:
# config/puma.rb
workers 0
threads 3, 3
port ENV.fetch("PORT", 4567)
environment ENV.fetch("RACK_ENV", "production")
Ну и SQLite в том же гигабайте тоже хочет память под кэш.
С SQLite и потоками один нюанс: пишет она по одному, и если два запроса пишут одновременно, второй получит database is locked. Включи WAL и busy_timeout, для бота хватит с запасом. На такой нагрузке Puma с тремя потоками будет занимать 60-70 МБ.
Ещё совет: systemd-юнит с Restart=always, чтобы бот сам поднимался после перезагрузки VPS. Хостеры иногда перезагружают ночью без предупреждения