0

これは、多くの大規模なプロジェクトで私が見つけた一般的な問題です。

  1. 常にサーバーを停止して再起動しているため、開発中は問題なく動作します
  2. 本番環境で何時間も実行すると、メモリまたはスレッドの問題が明らかになります。

非常に簡単なプロダクション ソリューションは、数時間ごとにプロセスを強制終了して再起動することです。

それが 100% の時間で機能し、この問題なしでプログラムを数時間 (数日) 実行しようとするのは非常に困難である場合、問題を解決するためにエンジニアリング リソースを費やす必要はありません。

4

1 に答える 1

5

それが100%の時間で機能し、この問題なしでプログラムを数時間(数日)実行しようとするのは非常に難しい場合、なぜ問題を解決するためにエンジニアリングリソースを費やすのですか?

申し訳ありませんが、最初はこの質問の要点全体を見逃しました。はい、それは次の理由で重要だと思います。

  1. プログラマーは常にコードをコピーします。現在、システムの他の部分に伝播している不良パターンまたはライブラリがサーバーで実行されている可能性があります。

  2. これが拡張が必要な​​サービスである場合、30分ごと、次に20分ごと、そして常に再起動する必要がある場合があります。この時点になると、問題を実際に見つけて修正するためのエンジニアリング時間がなくても、ほとんどの場合、問題が発生する可能性があります。より大きなボックスへの垂直スケーリングは、あなた自身の機会です。

  3. 一般に、エンジニアリングチームは演習から何かを学ぶことができます。一般に、これらの問題を診断する方法、特に実行中のプロファイラーとリーク検出器について最新の情報を入手する必要があります。

  4. この製品が現在開発中である場合、次の機能がメモリ曲線を変更し、この問題を悪化させるかどうかを予測することは非常に困難です。次に、次のリリースをプッシュする前に、問題を解決するために足が火になります。

ただし、これがメンテナンスモードでの使用頻度の低い製品である場合は、修正にリソースを割り当てないことはおそらく問題ありませんが、最適ではありません。


それがスレッドまたはメモリのリークであるかどうかを判断するという点では、それは本当にあなたが不足しているものに依存します。を実行して、ps大量のスレッドをフォークしていることがわかり、それが(スタックのために)メモリが不足しいる理由である場合は、その問題に取り組む必要があります。

生成されるスレッドの数が比較的安定しているように見えても、メモリが増え続けている場合は、メモリリークに集中する必要があります。

Linuxを使用している場合は、スレッドのプロセスIDをps auxf次のように確認できます。

root      2501  0.0  0.3 244448 25576 ?    Ss   Jul03   0:11 /usr/sbin/httpd
apache    2716  0.0  0.5 384776 46696 ?    S    Oct14   0:17  \_ /usr/sbin/httpd
apache    2717  0.0  0.5 382208 44304 ?    S    Oct14   0:11  \_ /usr/sbin/httpd

子スレッドの数が増加しているかps、プロセスの仮想メモリがスワップまたはヒットするまで増加していることを示しますulimitが、スレッドは比較的一定です。

于 2013-03-18T21:28:38.857 に答える