月3000ドルのHeroku費用を月55ドルサーバーに置き換え!驚異のコスト削減!
引用元:https://news.ycombinator.com/item?id=45661253
htopのスクショ見て、swapがないのに気づいたよ。サービスが暴走してもサーバーが落ちないようにearlyoomを有効にしたらいいかも。Linux KernelのOOM killerは遅いことが多いからね。zramでRAMを圧縮して、プロみたいに過剰プロビジョニングもできるよ。メモリリークするソフトはよく圧縮されるからね。HetznerサーバーでのAnsibleを使った設定例はこれだよ: https://gist.github.com/fungiboletus/794a265cc186e79cd5eb2fe… VMでもいける。
いやー、それはありえないね。swapを使うとほとんどのアプリは最悪の動きになるよ。AWSのEC2だってデフォルトで無効にしてるくらいだし。RAMを売ろうとしてるのもあるけど、今の期待値にはswapは合わないってのが本当なんだ。90年代ならボタンクリックで数秒待つのもアリだったけど、今はもう固まったら死んだと思って再起動しちゃうよね。
それは誤解だよ。a) SSDのおかげでswapはほとんど目に見えないし、何かあった時の緊急避難路になる。b) swapはRAMが溢れた時だけじゃなく、未使用ページをスワップアウトしてRAMの負荷を減らすんだ。RAMが少ししか使われてなくてもswapは使われて、もっとホットデータをキャッシュできる。再起動が簡単でも、長期的に見たら良い解決策じゃないよ。「知らんわ!」はダメな戦略だね。Kubernetesは「swap禁止」だけど、伝統的なシステムではまだ価値があるんだ。
なんだって、何の負荷の話?もしRAMが全然使われてないなら、何のプレッシャーについて話してるの?マシンで一番遅いドライブがSSDなら、swapへのキャッシュがどう役に立つっていうの?
いやいや、それはただのメモリ枯渇だよ。swapはRAMを効率的に使うのに役立つんだ。よく使うデータをRAMに置いて、他はディスクに任せる。もしswapを使いすぎたら大変なことになるけど、それはswapがなくても同じことだよ。真剣に、swapは良いものだから、変な噂に惑わされないでほしいな。
長時間動くLinuxはRAMを100%使うよ。アプリが使わない分はディスクキャッシュになるんだ。昔のLinuxは未使用ページをswapに送らなかったけど、今は長い間使われてないページをswapに送って、RAMにもっとキャッシュ領域を確保するんだ。KernelはSSDに直接キャッシュするんじゃなくて、使われてないけど退避させられないページをswapに送ることで、RAMをディスクキャッシュとしてたくさん使えるようにするんだよ。僕のPCでも20GBの空きがあったのに、2.5GBもswapに移動されてたよ。
「SSDがswapをほぼ見えなくする」ってのは違うと思うな。SSDも進化したけど、メモリもバスも進化して、プログラムの動作も変わってきてるんだ。スタックやヒープがメモリに収まることが増えたからね。僕、shellcheckで.zshrcを開くとRAMを全部食い尽くす問題があったんだけど、その時swapは全然見えなくならなくて、システムはめちゃくちゃ遅くなったよ。
ちょっと理解できないんだけど。もしシステムに十分なRAMを用意すれば、ホットなデータだろうがそうじゃなかろうが、RAMにある全てのページを使えるんじゃないの?
ねぇ、VPSでswapってどうやって設定するの?
ディスク容量よりRAMが多い時だけ有効な話だね。多くのアプリではむしろRAMの無駄遣いになっちゃうよ。
「linux enable swap in a file」で検索してみて。Linuxでスワップファイルを有効にするには、まずsudo dd if=/dev/zero of=/swapfile bs=1G count=1でファイルを作って、sudo mkswap /swapfileで設定。sudo swapon /swapfileで有効化。永続化は/etc/fstabに/swapfile swap swap defaults 0 0を追加すればOK。
90年代と今じゃプログラムのRAMの使い方も変わったんだよ。昔はスワップにヒットしてもパフォーマンスがガタ落ちしないよう最適化されてたけど、今やスワップを本当のRAMみたいに使っちゃうから、システム全体が止まっちゃうんだ。
メモリ切れはパフォーマンスを殺すんだ。VMは再起動した方が低レイテンシを保てるってことかな。なのに「スワップはまだ必要」って言うのはなんで?
君はどっちを選ぶ?
( ) 1%の確率でシステムは超ノロノロになるけど動く
( ) 1%の確率でカーネルが死んで何も動かなくなる
RAMはお金がかかるけど、ディスクは安いんだ。使わないコールドデータを全部高価なRAMに置くのは、ちょっと無駄遣いだよな。
earlyoomよりsystemd-oomd[0]とかoomd[1]の方が良いよ。systemd-oomdやoomdはカーネルのPSI[2]情報を使うから、earlyoomがポーリングするだけなのに対して、もっと効率的で反応が良いんだ。
[0]: https://www.freedesktop.org/software/systemd/man/latest/systemd-oomd.service.html
[1]: https://github.com/facebookincubator/oomd
[2]: https://docs.kernel.org/accounting/psi.html
まさにその通り。最近のほとんどのWebサービスはGC’ed runtimeで動いてるから、VMはあちこちポインタを辿って、常にスワップにアクセスしちゃうんだ。
ランタイムに完全に依存する話だね。GCがムービングコレクタなら、確かに気をつけないといけない。でもGo、CLR、Ruby、Python、Swift、あとNode(?)なんかのランタイムはメモリを動かさないんだ。JVMはムービングコレクタだよ。
「コールドデータを高価なRAMに置くのは無駄」って意見だけど、それはアプリがすでにやってることじゃん。作業中のデータはRAMに置いて、それ以外はストレージに残してるよ。ワーキングセット全部がRAMに収まるなら、なんでスワップがいるんだ?
VPSでそれを試してみて、結果を報告してほしいって強く提案するよ。
うん、例えばAPIサービスを書いてるなら、スワップアウトされたページを叩いて急にレイテンシが増えるのは嫌だよね。少なくともサーバーがオーバーロードしてない時は、API呼び出しのレイテンシ変動には保証がほしいんだ。カーネルがNRUページよりキャッシュを優先するのも嫌だし。一番簡単な方法はスワップを無効にすることだよ。
誰かこれ説明してくれない?スワップって根本的な問題を先延ばしにするだけじゃないの?それとも質的な違いがあるのかな?
RAMを圧縮することによるパフォーマンスへの影響ってどうなの?
俺の仕事用のUbuntuノートPCはRAMが40GBで、めちゃ速いNvme SSDを積んでるんだけど、メモリ圧力がかかると15〜20分間スワップしまくって、実質フリーズして使い物にならなくなるんだ。だから、SSDでもスワップが目に見えないなんて経験はないね。
これはほとんどのSSDには当てはまらないね。Linuxがスワップを激しく使う時、ディスクが本当に速くないと実質的に使えなくなるから。十分速いSSDは手に入るけどさ。スワップを激しく使う時のワークロードは、100%ランダムな4KBの読み書きが同量なんだ。多くのSSDは高い読み書き速度を持つけど、混合ワークロードだと性能がずっと悪くなる。以前、数百GBのRAMが必要な作業でIntel Optaneドライブをスワップとして使ったことがあるけど、レイテンシがめちゃくちゃ低かったから、タスク実行中でもマシンはほぼ完璧に動いたし、動画もフレーム落ちせずに見れたくらいだよ。
念のため、1GBくらい少量でもスワップを持っておくのはいつも良いアイデアだよ。
「earlyoomはただポーリングしてるだけ」?
systemd-oomdはシステムとcgroupのPSI統計を定期的にポーリングして、いつアクションを起こすかを決めてるよ。systemd-oomdのドキュメントが間違っているか誤解を招くのかは不明だね。kernel.orgのリンクを見ると、推奨される使用パターンはpollシステムコールを使うことなんだけど、この文脈だと「ポーリングしない」って意味になるのかな、もし俺が正しく理解してるならだけど。
どうなると思う?今EC2インスタンスで試してみたけど、予想通りに動いたみたいだよ。
どんなガーベージコレクターも、動いてるプログラムの参照グラフ全体を常にふるいにかけて、どのオブジェクトがゴミになったかを見つけなきゃいけないんだ。世代別GCは古い世代を追跡する頻度を減らせるけど、それくらいだよ。トレーシングGCは、複雑で循環する可能性のある参照グラフの管理っていう一つの問題をめちゃくちゃ良く解決するけど、それ以外のシステムレベルやパフォーマンス関連の評価要因については、とにかく最悪なんだ。
https://news.ycombinator.com/item?id=45007821
スワップ使うのは根本問題の先延ばしだってば。Linuxのメモリ割り当て問題、なんでみんな解決しないの?ファンボーイはプロセス強制終了を良しとしてるけど、スワップ使うと遅くなるって思い込みすぎ。SQL serverとか専用機で一番メモリ使うプロセスって何だと思う?って話だよ。
もっとコメントを表示(1)
俺のPCの状況を見せてやるぜ。
Mem: 15838MB中9627MB使ってるけど、Swap: 4095MB中0MBだぜ。
uptime見たら37日以上稼働してて、ロードアベレージは0.00。全然問題ないじゃん?ってこと。
Railsのパフォーマンスに詳しいNate BerkopecもHerokuは25~50倍も高すぎって言ってたぜ。価格競争する気ゼロだろ。Sidekiqみたいにソフトウェアスタックをライセンスして、自分で良いハードウェア使わせてほしいよ。2025年に1GB RAMのDynoに50ドルって、完全にぼったくりだろ。開発用MacBookより性能低いマシンに何百ドルも払うとか、ありえない。
ガソリンスタンドのオイル交換、高すぎ!自分でやればもっと安いのに!
レストランのステーキ、高すぎ!自分で焼けばもっと安いのに!
…!
って、Herokuが高いって言うのと同じこと言ってるよな?
「ソフトウェアスタックをライセンス提供すべき」って意見、まさにそれ!だから俺たちは https://canine.sh を作ってオープンソースにしたんだぜ。PaaSがクラウドプロバイダの料金にさらにボッタクリ価格を乗せるなんて、マジでありえないから。
「2025年に1GB RAMのDynoに50ドルはぼったくり」って話だけど、AWSだってあんまり変わんねーよ。月50ドルのm7a.mediumインスタンスは1vCPUと4GB RAMだぜ。メモリは多いけど、AWSがどれだけ儲けてるか考えたら、これも納得いかねーよな。
さっきのステーキの話、皮肉だってわかってるけど、俺はあの意見に100%同意するぜ。牛肉が高騰して、パンデミック後に物価が上がりまくってんだ。ぼったくられてるって感じると、もう何を楽しむ気にもなれねーよ。
価格吊り上げっていうより、Herokuは顧客の心理を利用してるんだぜ。顧客は使い始めの価格に慣れちゃうから、ハードウェアがどんどん良くなってるのに、Herokuの価格は7年以上変わってない。だから、今の感覚で「ぼったくり!」って感じるのは、古い価格と今のハードウェアを比較してるだけなんだ。競合が少ないHerokuは価格変えないから、この記事みたいになるんだよ。
canine.shは良いと思うけど、PaaSを使う一番の理由って、マネージドデータベースとバックアップなんだよな。だって、自分でサーバー用意するのだって、プレーンなLinux VMとかだったらそんなに難しくないんだから。
Herokuはただのホスティングじゃないぜ。Kubernetes管理なしで一時的なQA envsとか使えるの、すごくいいんだよな。今は停滞してるけど、簡単なシステムなら、運用チームなしで最新の運用システムの良いとこ取りができるんだ。Flyも似た方向性だけど、Herokuにはまだ全然追いつけてないってのが正直なところかな。
Herokuの価格に文句言ってる人が多すぎるけど、安くて良い代替サービスは山ほどあるんだから、ちょっと努力してそっち使えばいいじゃん?他人がHerokuに金使っても誰も困らないし、文句言うの変だよ。Herokuより信頼性があって安いデプロイオプションは文字通り何百もあるからね。
完全に同意!プロダクションのPostgres DBは自前でやらずに、Crunchy Data、Neon、Supabase、AWS RDSみたいな専用の優れたサービスを使うべきだね!
この話はコモディティ化したソフトウェアには当てはまらないね。100ドルプラス1時間のリサーチと短いドライブでオイル交換するのと、すぐ隣で2,500ドル払って便利なオイル交換をするのを比較してるようなもんだよ。
m7aはHyperThreadingを使わないから、1 vCPUは完全に専用のコアだよ。Herokuの標準dyno(共有ホスティング)と比較するなら、同じく共有でかなり安いt3aファミリーの方が適切だね。
HerokuはRailsのVercelみたいなもんだね。動くからって理由でみんな大金を払うんだ。これがずっと彼らのビジネスモデルだから、今に始まったことじゃないよ。需要が爆発的じゃなくて利益率も薄いから競争も少なく、結果的に停滞するんだ。
データ量によるね。ダンプするだけならいいけど、そうじゃないならちょっと手間がかかる。でも、データストアへのアクセス遅延が数ミリ秒じゃなくてサブミリ秒なら、アプリ開発はずっと楽になるよ。だからその手間はかける価値あるかもね。
Sentryは動くの?ログ、メトリクス、トレースを送れて、クエリは速いのかな?
私が勘違いしてるのかな。m7aは第4世代Epyc(Genoa、Bergamo、Siena)だと思ってたけど、それらは全部コアあたり2スレッドじゃなかったっけ?
VercelはHerokuよりフロントエンドの市場がずっと大きいから、多くの競争があるはずだよ。Netlifyも同じ価格設定だし、CIからクラウドバケットに放り込むだけで済むしね。
「オイル交換は自分でやった方がずっと安い」って言ってるけど、本当に?オイル交換ってかなり安いじゃん。Walmartで40ドルくらいでできるし、結構安くない?
Herokuの価格が高すぎて、俺も知ってる奴らも誰も使わなくなったみたい。彼らは俺とは違うターゲット市場にピボットしたか、それか収益を抽出しようとして自社の成長潜在力を殺しちゃったかのどっちかだと思うと悲しいな。
誰も高いサービスを使えって強制されてないんだよ。Herokuがまだビジネスしてるってことは、十分な数の人が妥当な取引だと考えてるってこと。お前はそうじゃなくても、他の人はそうなんだ。
サブミリ秒のレイテンシーでローカルにDBを動かすのはかなり小規模じゃないと無理だよ。データセンターのDBAチームが提供するDBは、RDSとかと同じくらいのレイテンシーになるはず。データセンター内のネットワークレイテンシーだけで1〜3msかかるしね。
よく言った!Herokuには驚くほど多くの機能があるんだよ。DB/Redis、フォーク、ログプレックス、オートスケール、アドオンエコシステム、プロモーションパイプライン、コンテナサポート、CLI/API、OS/パッチ管理など盛りだくさん。生サーバーとメガクラウドの複雑さの間の良いとこどりをしてたんだ。FlyやRailwayも良いけど、Herokuの機能はプロダクションアプリにとって想像以上に深いんだ。ただ、ホビイストにはもう向かないってのは同意するよ。
企業がHerokuに喜んでプレミアムを払うのは、インフラ管理に貴重なエンジニアリング時間を費やすより、製品構築とビジネス創出に集中できるからだよ。製品が成功してコスト高になった頃には、拡張したり移行したりするリソースも十分にあるはずさ。ソロ開発者にとっても、DevOpsが好きじゃないならHerokuを選ぶのは賢い選択だね。
Kubernetesの柔軟性とパワーは本当にすごいと思う。複数のノードへのスケーリングは簡単だし、データプレーンが吹き飛んでも復旧は楽勝だよ。ほぼどんなオープンソースサービスも自分でホストできるし、Telepresenceで内部ネットワーキングも可能だ。(例えば、公開したくないMetabaseをtelepresence connectで内部からアクセスできるんだ。)Canineは既存のベストプラクティスやツールを活用しようとしてるね。でも、基幹業務のDBはKubernetesに置くべきじゃないってのは同意だよ。
AWSもひどい料金設定だよ。通常の仮想サーバーは少し高いけど、法外ってほどじゃない。問題は、データベース、バックアップ、ストレージ、マネージドサービスとかの付帯サービス。ドル/ブーガルーで課金されて、さらに水税みたいなのと、規定量を超えると10倍の料金がかかるんだ。ほとんどの顧客は、これらのサービスでどれだけ少ないコンピューティングしか買ってないか分かってないんだよ。
お前が混乱してないってのは正しいよ。AWSはカスタムチップを使ってるか、SMTを無効にしてるかのどっちかだね。AWSのM7aインスタンスでは、各vCPUが物理CPUコアなんだ。つまり、SMT(同時マルチスレッディング)はないってこと。M6a以前のインスタンスでは、各vCPUはCPUコアのスレッドだったんだよ。たぶんSMTを無効にしてるんだと思うな。Intelインスタンスではカスタムプロセッサを大々的に宣伝してるけど、このページには「カスタム」って言葉がないからね。URL: https://aws.amazon.com/ec2/instance-types/m7a/
AWSは既存サービスの値下げや安価な新世代インスタンス(Gravitonなど)の導入をよくアピールしてるよね。他のクラウドベンダーもそうだけどさ。
Supabaseみたいなのを使うって話でしょ。あと、小規模って言っても人それぞれだよね。Herokuの話は「ナノスケール」って呼んでもいいかも。モダンなハードウェアなら1台のサーバーで数万QPSも処理できるし、ほとんどのワークロードには十分すぎるよ。
ミッドマーケットのクラウドはAPIが不安定だったり機能が不足してたりして、信頼できるシステムを作るのは大変だよ。でも、sherpa.sh(https://www.sherpa.sh)っていうVercelの競合を作ってるんだ。EUベースのCDNと専用サーバー(Hetznerとか)でコストを70%削減できるんだよね。
もっとコメントを表示(2)
クラウドが浸透したせいで、一台のマシンでどこまでできるかみんな忘れちゃったよね。高価なクラウド環境にステージングを置くのはどうかと思うけど、今のクラウドは部品が多いから、そうしたくなる気持ちもわかるよ。
クラウドのせいでみんなLinuxサーバーを怖がるようになったよね。あの値段は開発者の不安の代償でしかない。皮肉なことに、セルフホスティングって結構シンプルで楽しいんだよ。HerokuとかVercelの魅力が全くわかんないな。自分でサーバーをゼロからセットアップするほど楽しいことはないよ。開発者ならみんな試すべきだね。
セルフホスティングは最初は楽しいけど、何度も繰り返すのは面倒くさいんだよね。HerokuとかVercelならgit pushするだけで動くじゃん。LinuxサーバーだとOSや認証、アプリ、systemctl、リバースプロキシ、デプロイ、SSL管理、監視とか、やることがたくさんあるんだよ。柔軟性で言えばLinuxサーバーが好きだけど、UXはもっと良くなるはずだよね。
人に何かやってもらってお金払うことの魅力がわからないの?って話だよ。Vercelは簡単じゃん。その簡単さにみんなお金を払ってるんだよ。最初は簡単なモードから始めるのが普通だろ。好みは人それぞれなんだからさ。
誰かに仕事をしてもらってお金を払うのは好きだよ。でも、その仕事が50倍ものマークアップ(上乗せ料金)に見合うかっていうのが問題だよね。
小麦粉と塩と水はすごく安いよね。でもパン屋で買うパンは、自分で焼くのに比べて50倍以上の値段がついてるはずだよ。自分でパン職人レベルになる学習コストや、毎日パンを焼く時間を考えたら、そっちの方がずっと安い。それに、毎日パンを焼くような規模で必要になることもないだろうしね。
小麦粉の値段、ちゃんとチェックしてみてよ。水は安いけど、塩はそこまでじゃない。パンを手作りするってのはすごく小規模な話だよね。もし大量に作るなら、特別なミキサーや大きなオーブン、あと生地を発酵させるための温度と湿度を管理した部屋も必要になるはずだよ。
最初は楽しいけど、繰り返しやると面倒くさい作業になるよね。確かにそうだけど、そういう作業を自動化してくれるツールはたくさんあるから、ずっと手動でやる必要はないよ。
うん、でもそれは単なる駆け引きだよ。車のベルト交換のやり方を知ってて、すでにツールも持ってる場合と、工具もガレージもベルトもなくて立ち往生してる場合とは違うんだから。
メカニックなら車のベルト交換の仕方を知ってるべきでしょ。生計のためにコードを書いてコンピューターを扱ってるのに、ウェブサーバーのセットアップ方法を知らないなんて、ありえないよ。
Hetznerのスペック(8コア、32GB RAM)に匹敵する中古のDellデスクトップが500ドル以下で買えるのに、なんでそうしないの?クラウドは進化するにつれて、だんだん詐欺みたいに思えてくるね。
そのツールとそれぞれの役割を教えてくれない?
本番環境を完全に複製するのは役に立つよ。デプロイが似てるから時間が節約できるし、本番環境がどうなるかのテストもより良くできるからね。
全く同感だよ。もし違うプラットフォームでホストされてるなら、それはステージングサーバーとは言えないよね。
あと、単一マシンでどこまでできるかも、過去15年でめちゃくちゃ変わったよ。15年前の(本当にごつい)単一マシンは8コア、256GB RAM、数TBストレージだったけど、今じゃ256コア、8TB RAM、1PBストレージになるんだから。
Ansible、Salt、Puppetはだいたい業界標準だよ。これらは一般的に設定管理システムって呼ばれてる。AnsibleはXにログインして、YがないならXのステップを実行するっていうワークフローを自動化するんだ。多くのディストリビューションやOSをサポートしてて、タスクランナーみたいに使えるよ。
Saltはシステムの状態を宣言的に記述させて、エージェント/中央ホストシステムで設定を配るんだ(プッシュ型)。Puppetも宣言的でエージェント/中央ホストシステムがあるけど、プル型のアプローチを使うよ。mgmtとかNixOSみたいな専門的で珍しい選択肢もあるね。
自動化の重要性を説いている。2005年でもDebianインストールディスクとスクリプトでサーバーのプロビジョニングを自動化してたよ。今はsystemdやNixとかでもっと良くできるね。
前のコメントの例は基本的なプロビジョニングしかカバーしてないよね。親コメントで言ってた追加項目は、初期費用も運用費用もかなりかかる可能性があるよ。
詳しい説明ありがとう!これらのツールの実際のユースケースを教えてくれる?特に、自己ホスティングでのDevOpsとセキュリティを自動化するツールを探してるんだ。
開発者にクラウドの基本を教えるのは最初は安上がりだけど、最終的にはクラウド費用が人件費を上回り、クラウド離れが儲かるようになるよ。サーバーを素早くデプロイできないならクラウドは価値があるけど、インフラチームやハードウェア費用を超えたら意味ない。節約できるかのカーブがあるね。
コンシューマー向けPCの性能はめちゃくちゃ速いよね。例えばRyzen 5825UのミニPC($250)は、2016年の14コアXeonよりマルチコアで優れ、シングルスレッドでは圧倒するよ。ECCはないけど、テスト環境とかなら十分で、消費電力も少ない。
>いや、僕のやり方は基本的なプロビジョニングだけじゃないよ。nginxや監視エージェントとか、必要なアプリケーションの設定や、鍵や認証情報のインストールもカバーしてたんだ。親コメントが挙げたもので、僕の方法で対応できないものって何があったっけ?