Webサーバーを定期的に再起動することは、業界のベストプラクティスですか?[閉まっている]


28

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

日中にサイトがクラッシュするという問題を軽減する顧客の観点からは、SysAdminの観点からはひどい解決策です。

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


41
アプリケーション開発者がメモリリークを見つけて修正するのが業界のベストプラクティスであることを伝えます。
バートシルバース

4
@Bart Oh snap !!
mfinni

1
一日を作るためだけに+1(PS:私は自分で開発者です)
RN。

1
彼はサーバーやサービスを言ったのですか?毎晩サービスを再起動する必要があるTomcatアプリケーションがあります。実行しないと、将来のある時点でクラッシュします。私はそれをしたくないのですが、日中のサービスはより重要です。
浴槽

1
ログファイルの監視を開始し、JVM監視ツールをダウンロードします。日中に何かがクラッシュした場合、デフォルトの例外であっても、例外またはログに記録された何かが表示されます。これにより、エラーの一般的な性質についての洞察が得られます。また、JVMのメモリ使用量を監視します。オッズは本当に優れており、メモリリークが発生しています。サーバーJVMヒープを監視すると、それをキャッチできます。適切なシステム管理者データを使用して、悪い開発と戦います。「あなたは自分が何をしているのかわからない」という防御を破壊し、物事が台無しになった理由について実際に答えなければなりません。
フロッピーディスク

回答:


29

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


1
これは非常に良い点です。以下に示すようにサーバーを再起動しないと、適切に起動しない特定のサービスがあることを知らない可能性があります。その後、停電やハード再起動が発生した場合、サーバーが正常に戻らない場合があります。
-einstiien

1
+1。毎月の方が理にかなっている場合があります-再起動だけでなく、パッチなどを適用する通常の操作手順のために。 「再起動」がスケジュールされ、その時点ですべてのパッチなどもサーバーに配置されます。これにより、計画の安定性と標準的な運用手順が損なわれます。
トムトム

12

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

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

定期的にアプリケーションを再起動することをSOPにすることで、あなたの会社は重大なバグをカーペットの下に隠しています。これは言い訳になりません。バグを裏返しにして潰す必要があります。さもないと、後でバグが発生します。

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

あなたが開発者に取って代わる立場にないかもしれないことを考えると、いくつかの提案:

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

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

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


2
実際、多くの場合、バグがあるのはインフラストラクチャであり、開発者のコ​​ードではありません。JBossでは定期的にガベージコレクションの地獄に入るが、他の商用アプリケーションサーバーでは正常に動作するJ2EEアプリで問題は終わりませんでした。そのため、開発者のせいではなく、展開環境のせいかもしれません。
rmalayter

6

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


3

ここでの多くの答えは、実用的な解決策のマークから外れているようです。彼らはドグマを避けているようです-サーバーを決して再起動すべきではありません-なぜファイブナインがあるのですか?耐障害性?まあそれは彼らが起きていることになっているとき、彼らは起きている。

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

サーバーをプロアクティブにリブートすると、私の考えでは週に1回または月に1回は賢く効率的であると言えます。クラスター化されており、サーバーをローテーションする場合、クライアントに1ビット影響を与えないでください。クライアントは、サーバーのパフォーマンスに非常に満足しています。


2

IMOサーバーはできる限り停止しないでください。アプリ開発者がメモリリークのある見苦しいアプリケーションを作成した可能性が高くなります。


絶対に-OPは、より良い開発者を見つける必要がある人に伝える必要があると思います。
ヘルビック

2
大企業がマルチナインのアップタイムに巨額を支払う理由と、企業が冗長電源、RAID、ホットスワップケージなどに数千ドルを費やす理由がありますが、1日1回だけ再起動する必要があるわけではありません。
バートシルバース

1

私は毎晩Webサーバーの1つを再起動するスクリプトを持っていますが、それは業界標準ではなくJavaアプリケーションの記述が不十分なためです。ただし、Webサービスを再起動することは珍しくありません。これにより、探しているメモリのクリーンアップが行われ、完全な再起動に比べてサーバーへの負担が少なくなります。


1

サーバーは決して再起動しないでください。これが、フォールトトレランスを備えている理由の1つです。アプリケーションが原因でサーバーを再起動する必要がある場合、アプリケーションはメモリリークを起こし、正しく構築されていません。

私は以前にTomcatを使用していましたが、同じ問題を抱えていました。次回Javaコンテナを使用するときは、JBossまたはGlassFishなどの別のコンテナを探します。

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


4
サーバーを決して再起動すべきではないと言うとき、私は同意しないと思います。セキュリティ修正を適用するには、サーバーを再起動する必要があります。ただし、計画されたメンテナンス以外のことのために再起動する必要はありません。
ゾレダチェ

セキュリティ修正を適用するには、一部のサーバーを再起動する必要があるのは事実です。ただし、十分なシステムがあれば、システムを再起動する必要はありません。年々実行されているシステムが存在します。インターネットでサービスを提供している場合は、高可用性を目指してください。クラスターのようなフォールトトレラントシステムがある場合、サービスがまだ実行されているときに、ノードを1つずつ停止して更新できます。
ジョナス

1
サーバーやハードウェアが1つしかない場合は、高可用性などはありません。サーバーを1つだけ提供し、サービスが非常に重要であるためにサーバーを再起動するために15分間のダウンタイムを何度も許容できない場合、それは間違っています。「ゼロダウンタイム」アプリケーションがある場合、複数のノード備えた真のHAシステムになります。この場合、指摘したとおり、パッチなどの定期的な再起動は非常に簡単です。
EEAA

1
「次回...別の[Tomcat以外のJavaコンテナ]を探します」。Tomcatを非難するつもりはありません。私は何年もの間、本番サービスを実行していますが、この問題が発生するたびに、アプリケーションの問題であることが判明しました。「確実なアプリケーションを用意してください、それが最良のソリューションです」まさに。面白いことに、これまで使用した他のすべてのJavaアプリケーションサーバーは、リークコードを実行すると同様の問題を抱えています。とは言っても、Tomcat 7には何らかのプロアクティブなメモリリーク検出機能が備わっているはずです。
キーフ

0

私が今まで見た中で最も頻繁なのは毎週です。私が今いる場所はウィンドウズショップで、火曜日のパッチに続く週末に毎月行っています。


ある場所で仕事を始めたとき、彼らはその場で毎晩再起動していることがわかりました...特にサーバーが正常に戻らない可能性が約1〜2%あるため、それは恐ろしいことでした(ハードドライブドライバーのタイミングバグ)。再起動の「原因」を修正するのに時間がかかりました。よく過ごした時間。
ブライアンノブラウチ

0

サーバーを常に再起動するのは理想的ではないことに同意しますが、それが開発者のせいでも間違ったことでもない場合があります。Python Popenライブラリの問題が原因でメモリをリークしている正常に動作するアプリケーションがあります。それはすぐに廃止される古いアプリケーションですが、ビジネスに不可欠です。私たちは、クライアントのために最小限の手間でそれを実行し続けなければなりません。そのため、毎晩サーバーを再起動することにしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.