- 締切済み
プログラムのリリースを本稼働中に行っても問題ない?
VB.NETでシステムを開発しました。 クライアントからサーバ機能を呼び出すにはIIS上のWEBサービスを呼び出す方式です。 ┏━━━━━━┓ ┃クライアント┃ ┗━━┳━━━┛ ┃ ┏━━┻━━━┓ ┃ IIS ┃ ┗━━┳━━━┛ ┃ ┏━━┻━━━┓ ┃ DBMS ┃ ┗━━━━━━┛ 顧客から時々エラーになってサーバ側の処理が止まってしまうと言われています。 エラーログを確認すると「基礎になる接続が閉じられました。」と言うようなメッセージです。 なぜそのようなエラーになるのか全く原因がわからず、困り果てていました。 そんなある日、いつものように(それはそれで困るけど・・・)いくつかバグ・仕様変更があり、サーバ側機能を改修しました。 上司は、顧客の業務時間中に修正版のリリース(プログラムの入替)を行いました。 どうやらこの上司は修正版のリリースをいつも顧客の業務時間中に行っているようです。 私は現在稼働中のシステムのため修正版のリリースは顧客の業務終了後にすべきと言いましたが、上司は、『実行時、プログラムはメモリに読み込まれているのでHDD上のプログラムを入替ても問題ない。』と言いました。 そこで質問です。 本稼働中のシステムの修正版プログラムのリリースを本稼働中に行っても問題ないのでしょうか? 上司の言っていることが正しいならば、極端な話、本稼働中にプログラムをHDD上から削除しても大丈夫ってことですよね?だってメモリに読み込まれているはずでしょ? でもそれっておかしいと思いません? (上司の言うように、実行時はプログラムはメモリに読み込まれている点は私も同意します。同意できないのはHDD上のプログラムの入替がメモリ上のプログラムに影響を与えないのかどうかってことです。普通に考えると、HDD上のプログラムが変更されたのだからOSはプログラムを読込み直すはずでは?) ついでに質問ですが、365日24時間稼働しているECサイトなど、プログラムの入替などはどうやっているのでしょうか? プログラムの入替時はシステムを停止しているのでしょうか?それとも何らかの裏技(まっとうな技術)があり稼働中のまま入替が可能なのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- m-take0220
- ベストアンサー率60% (477/782)
実行可能バイナリ(Windowsであればexeやdllなど)は、実行時にメモリに読み込まれると同時にファイルがロックされ、変更や削除ができなくなります。また、dllなどのモジュールは、一度メモリに読み込まれると明示的に開放しない限り再度読み込まれることはありません。Windowsがメモリを確保するためにスワップの対象にしたとしても、コードはページファイル上におかれてロックは継続されます。 今回はIISを使っているようなので、IISが扱うファイル(html、ASP、ASP.NET)のことなのでしょう。 これらのファイルは、IISがメモリに読み込んで使用しますが、ロックはしないので、上書きや削除が可能です。しかし、IISはメモリ上のデータをそのまま使い続けるわけではなく、新しく処理を始める際にファイルが変更されていないかをチェックし、必要であれば再読み込みします。ただし、ファイルを変更したら即座に再読み込みされるかというとそうでもない場合があり、厳密なタイミングは公開されていない状態です。 なので、動作中に更新することは可能ですが、複数ファイルを更新する場合には、 ・IISが読み込み中のファイルがあると、上書き処理がエラーで中断される可能性がある ・コピー中にIISが動作して、更新されたファイルと更新されていないファイルが混在状態での動作になる場合がある といったことから、やめておいた方が賢明です。 ファイルの変更をチェックしているので、「メモリ上に読み込まれているから大丈夫」というのは間違いです。
- foomufoomu
- ベストアンサー率36% (1018/2761)
詳しくは知りませんが、いまどきのプログラムは一度にメモリに読み込まれず、必要に応じて少しずつメモリに読み込まれることがあるようです。
- t_ohta
- ベストアンサー率38% (5238/13705)
プログラムは実行中メモリに読み込まれているので、HDD上のファイルを書き換えてもメモリ上に読み込まれているプログラムには影響しません。 プログラム(プロセス)の再起動を行わない限り、プログラムの変更は反映されません。 ファイルが書き換わってもOSが勝手にプロセスを再起動することもありません。 但し、注意が必要なのは、そのプログラムが親プロセスである必要があると言う点です。 何かのプログラムから呼び出される形で動くモノだと、呼び出されるたびにHDDから読み込まれますので、ファイルの書き換え中に呼ばれるとエラーになりますし、複数起動される場合はプロセスによって処理が異なると言う問題を起こします。 24時間365日稼動しているECサイト等ですが、基本的にサーバは複数台で冗長化されており、ロードバランサーを使って負荷分散させています。 メンテナンスを行う場合、DBの改修が必要といった大規模なモノでなければ、1台のサーバをロードバランサーから外してシステムの入れ換え・再起動を行い、動作確認が出来たらロードバランサーに登録すると言うのを順番に繰り返すことで、サービスを止めずにメンテナンスを行います。