web-dev-qa-db-ja.com

Webサーバーを定期的に再起動することが業界のベストプラクティスですか?

Tomcatで実行されるWebアプリケーション(サードパーティによって開発された)があります。アプリケーションのパフォーマンスが非常に低下しています。アプリケーション開発者は、すべてのメモリ使用を解放して最初からやり直すためにWebサーバーを毎晩再起動することが業界のベストプラクティスであると主張しています。

日中のサイトクラッシュの問題を軽減する顧客の観点からは、SysAdminの観点からは、それはひどいソリューションです。

私たちはこれらのアプリケーションのうち20を異なるクライアントの異なるサーバーでホストし、すべてが毎晩再起動されることを確認する調整は間違っているようです。

28
Geo

これは確かにベストプラクティスではありません。すべてが正しく起動することを確認するためだけにサーバーを定期的に再起動するのはisでよいのですが、夜間に再起動する必要があることは、アプリケーションの非常に深刻なメモリリークを示しています。

29
EEAA

多くの人が正当な理由で行う「ベストプラクティス」と、怠惰または無知であるために多くの人が行う「一般的なプラクティス」には違いがあります。

正常に動作し続けるために定期的に再起動または再起動する必要があるアプリケーションおよび(さらに悪い)サーバーareかなり一般的です。ただし、重大なバグがあることも明らかです。

SOPアプリケーションを定期的に再起動することで、あなたの会社はカーペットの下に深刻なバグを隠しています。これは許されないことです。バグを下向きにしてつぶす必要があります。そうしないと、後であなたを噛むために戻ってきます。

理想的には、会社はより優れた開発者を見つける必要があります。残念ながら、これはコードの大きな部分を書き直すのにかなり多くの作業につながるかもしれません。開発者が不十分に書かれたコードは許容できると考えるか、バグのあるコードの症状を認識するのに十分な知識がないかのどちらかであるという事実は、コードの品質が低いことを示唆しています。優れた開発者は、憲法上、その状態を維持することができません。

あなたが開発者を置き換える立場にないかもしれないことを考えると、いくつかの提案:

  • より優れた開発者にコードをレビューしてもらい、それについて何かできる人にその評価を報告してもらえるかどうかを確認します。
  • プロファイリングツールをご覧ください。スキルや傾向がある場合は、自分でコードをプロファイリングして、リークを見つけて報告してください。

開発者向けのプロファイリングツールを使用しなくても、Javaアプリケーションのメモリ使用量をプロファイリングおよび監視するためのシステム管理者向けのツールがたくさんあります。実際にメモリ(特にヒープ)の監視を設定する必要があります。いずれにせよ、運用サーバーです。高品質のコードを実行している場合でも、これをお勧めします。バグのあるアプリが転倒しそうなときに、事前に警告が表示されることがあります。

しかし、さらに良いことに、これらはリークがあるという証拠を収集するのに役立ち、アプリケーションのどこに問題があるかを示すことさえできます。これにより、ロビーを修正するための弾薬が改善されます。

12
Kief

アプリケーション開発者は、彼がやった専門外の仕事を回避することによって彼のお尻をカバーすることがあなた自身の最善の利益であると主張する可能性が高いです。彼は、なんとメモリリークのあるものを書いたことを実際に認めるまでには至らなかったかもしれませんが、それほど遠くないわけではありません。

6
Maximus Minimus

ここでの多くの答えは、実際的な解決策のマークからはずれているようです。彼らはドグマを避けているようです-サーバーは決して再起動されるべきではありません-なぜ私たちはファイブナインを持っているのですか?フォールトトレランス?まあそれはそうです彼らがアップしていることになっているとき彼らはアップし続けます。

また、悪い開発者の原因や悪い開発慣行を述べることは、問題の根本には行きません。それは悪いことではありませんが、多くの場合、悪いアプリケーションコードではありません。これらの問題は、システムコードの多くにすでに組み込まれています。小さなメモリリーク、Java=多くの小さなアプリを実行している場合のヒープとpermgenの問題。最新のサーバーとそれらが実行するソフトウェアは非常に複雑です。Tomcatのようなサーバーを考えるとファイルの処理、Webリクエストの処理、ネットワーク通信、データベース通信など、多くのことを行う必要があります。そのスタックには、多数の可動部品が含まれています。

積極的にサーバーを再起動すると、週に1度または月に1度は、私の見解ではスマートで効率的です。クラスタ化されていてサーバーをローテーションする場合は、クライアントに1ビットの影響を与えてはなりません。クライアントは、サーバーのパフォーマンスに非常に満足します。

3
Claude

IMOサーバーはできるだけシャットダウンしないでください。アプリデベロッパーがメモリリークのあるお粗末なアプリケーションを作成した可能性が高いです。

2
matpie

スクリプトで毎晩Webサーバーの1つを再起動していますが、これは業界標準ではなくJavaアプリケーションが正しく記述されていないためです。Webサービスを再起動することは珍しいことではないと思いますただし、これにより、探しているメモリのクリーンアップが行われ、完全な再起動と比較してサーバーへの負担が軽減されます。

1
einstiien

サーバーはできれば 決して 再起動されます。それが私たちが持っている理由の一つです 耐障害性。アプリケーションが原因でサーバーを再起動する必要がある場合は、アプリケーションでメモリリークが発生し、正しく構築されていません。

以前にTomcatを使用していて、同じ問題がありました。次回はJavaコンテナを使用する予定です。JBossまたはGlassFishなどの別のコンテナを探します。

編集: 今すぐ毎晩再起動する必要がある場合は、負荷が増加した場合に、より頻繁に再起動する必要があります。確実なアプリケーションを用意してください。これが最良のソリューションです。

1
Jonas

私が今まで見た中で最も頻繁なのは毎週です。現在のところ、私たちはWindowsショップであり、毎週パッチ火曜日に続く週末にそれを行っています。

0
Joel Coel

サーバーを絶えず再起動することは理想的ではないことに同意しますが、それが開発者の責任でも間違った行動でもない状況があります。 Python Popenライブラリの問題が原因でメモリリークが発生している、正常に動作しているアプリケーションがあります。これはすぐに廃止される古いアプリケーションですが、ビジネスに不可欠です。維持する必要があります。クライアントの負担を最小限に抑えて実行しているため、毎晩サーバーを再起動することにしました。

0
Nick Mellor