陣地縮小作戦

基盤:どうもVMが100GBを超えたあたりから起動・停止・設定が異常に遅くなりまして、何とかしたいと思います。

開発:SSDの残量がわずかになったせいかもしれませんね。ファイルが大きくなってアルゴリズムが切り替わるとか、あり得るのかな?あさって来る500GBのSSDを待ってからでも良いのでは。

基盤:いずれにしても、HDDとかクラウドに保管するのに、小さいに越したことは無いです。目標は10分(600秒)以内でのナマコピー完了。最悪100MB/秒での書き込みを想定すると、60GBということになります。現在仮想ディスクが128GBに膨れていますが、ごみを捨てれば60GBに収まります。実メモリが潤沢になったので、スワップファイルも不要。

開発:今後何度か試行的に大きくしたり小さくしたりすると思いますので、アシストしてくれるツールがあると良いですね。できればGUIの。

基盤:そうですね。とりあえずやるのに一番簡単なのは、新しいVMを作ってそこに現在のVMのファイルを転送することなんですが、何度もやるなら、パーティション拡張の時の parted + resize2fs 的なノリでできるとよいな、と思います。

基盤:それで検索したところ、GPartdというのがなんかよさげな感じです。フリーソフトで、今現在アクティブなプロジェクトです。まあ、お金かかってないんで、見た目は極めて素朴というか、実直そうなイメージです。

基盤:GPartdは、ISO形式でOSとして起動する、という形です。これをやるために作者はUSBにddで書き込んでとか面倒な説明をしていますが、仮想マシンならISOファイルをDVDドライブとして指定するだけで終了です。そしてリブート。超速で起動します。

基盤:そしてGPartdのコンソールから、変更したいパーティションとサイズを指定してApplyをクリック。以上で終了です。まあ、作業の手間としては数分かからないですね。

基盤:ですが、ここで恐ろしいことが起きました。例によってSSDが満杯になってしまい、Hyper/Vが泣きを入れてきたわけです。もうパーティション内での移し替えが途中まで行ってますから、内容も壊れているでしょう。直前のバックアップもあるので、VMを破棄しようとしたんですが、その前に一応ISOを切断して立ち上げてみたら、壊れてもないんです。つまり、Hyper/Vは差分ディスクにガンガン書いてたということでしょうね。でそれは単に破棄された。

基盤:SSDは空きがないのであきらめて、HDD版のクローンのほうでやることにしました。パーティションの中のブロックの移し替えはHDDの苦手なランダムアクセスです。案の定、ディスクアクセスはほぼ100%アクティブなんですが、転送量的には読み書き10MB/秒とか20MB/秒とか、ちんたらしか進んでいません。今現在、20分経過で20%くらいですから、まあ2時間がかりかなという感じです。

基盤:ただ、今思えば、差分ディスクだけHDDに置くというのが適切な作戦だったかも知れません。というかそもそも、チェックポイントを使わないというオプションもあったと思います。ですが今30分経過して50%くらいまで来たので、このまま終わるのを待つことにします。カップラーメンでも食おう。

基盤:GPartdは、機能的には満足だし、GUIも必要に十分だと思うのですが、作者の説明の仕方がどうも、カンタンそうに思わせないところがあります。たとえば、直感的に「そのパーティション」で右クリックすると、実際コンテクストメニューが開くんですが、そういう説明はしてないんですね。

基盤:それと、これはいずれにしてもかなり時間のかかる処理ですから、待ってるユーザに何か気休めを提供するのが良いと思います。表示はプログレスバーだけなのですが、これは目に見えては進まない。なので、数字のカウンターを表示するのが良いと思います。

基盤:あるいは、仮想マシンでの利用を想定した場合、現在のパーティションを上書きするというよりは、新しいパーティションというかデバイスをマウントして、そこにシュリンクしながらコピーするのが良いのではないかとも思います。ですが、そういうことなら、VMのユーザが自分でできるという話かなともいますけどね。新しい仮想ディスクを作ってマウントして、そこに移し替えて、差し替えれば良いわけですから。

基盤:おっと、90%近く来ましたね。というか、少なくとも進捗の%表示をして欲しいものです。残り時間の推定とかも。128GBを半分に縮退するのに1時間。十分かなと思います。おそらくSSDで同じことをやれば、10分でできそうです。カップラーメンできた。最近はずっとニュータッチ凄麺でしたが、久しぶりのカップヌードルカレー味です。

基盤:GUIの表示を見て気づいたのですが、Move /dev/sda1 to the right and shrink it from 124.00GiB to 60.01GiB。要するにやっていることは、resize2fs -p /dev/sda1 62921728K というコマンドのようです。たしかに、resize2fs のマニュアルには、マウントしたままのディスクではできません、って書いてありましたね。つまり、resize2fs が動作する環境だけのミニマムなOSがあれば良い。まあつまりそれが、GPartedのやってる事ってわけですが。

基盤:うーむ、これなら手作業で、というかスクリプトでやったほうがいいかなっていう感じもして来ました。実際、昔はディスクの移し替えとかそうやって手作業でやってましたね。いわゆるシングルユーザモードに落として。うーむ、基本うちの開発用のマシンはそもそもデフォルトがシングルユーザモードで十分な気はします。

開発:待ち時間が退屈なので、リードオンリー環境で端末が使えると良いですね。実際昔はそうなってたし、今もそうできるのかも知れない。

基盤:最近、クラウドで仮想マシンをやってて気づいたのですが、この世界のデータ量は GB、MB、KBという表示では無くて、GiB、MiB、KiBという表示が主流になりましたね。要するに2のべきであるのを10進数に丸めて考える人間の認識に寄り添っている。8192KBとか書くより、8KiBと書いたほうが書きやすいし読みやすいですから。GPartedもそういう感じなんですが、徹底してないのが惜しまれます。

基盤:うーむ、100%近くなったので終わったかなと思ったのですが、またプログレスバーが元に戻りました。そうか、つまり、一旦ディスクの終わりのほうに寄せてから、ディスクの先頭のほうに移し替えるってことですかね。つまり、ただのコピーの2倍時間がかかると。

開発:しかしこうやってみてると、やはり今の世の中、必要な機能はほとんど出来ているのに、それをユーザに分かり易くカンタンに操作させるやり方と、何が起きているのかをユーザに分かり易く知らせる手段がまるで不足しているなと、つくづく思いいますね。

社長:まあ、そこに美味しい皮をかぶせて売った人が、おいしいとこを全部持ってくっていう仕組みなんでしょうね。座りしままに食うは徳川みたいな。あれ、このフレーズそのまま、20年前にMLで書いた記憶が・・・

基盤:今度こそ、あと20分くらいで終わりますかねえ。相変わらずディスクのアクティビティ100%なのに、円総量が1MB/秒を切りました。ちっちゃいファイルを移動中なのかな?

基盤:おっと、最後はカウントダウンするのか。あと11:32 ・・・ 結局2時間半かかりました。

開発:無事に小さくなってメデタシですね。

基盤:まあこんなふうにガンガン作り替えるような仮想マシンは、HDDベースでは厳しいということを痛感しました。

開発:世の中にはSSHDというものもあるようですね。ただ、キャッシュにSSDを256MB程度積んでいるだけのようなのですが。

基盤:あれって不思議なんですが、そもそもPC側にキャッシュというかバッファのRAMがギガバイト単位でとれる状況で、ディスク側にサブギガバイトのSSDバッファがあって何かいいことがあるのかということですね。価格も通常のHDDの2倍するようです。PC向けじゃないのかな?

開発:基礎体力的には、もう十年以上前の7200回転とかで、HDDの世の中は止まってしまったんですかね。

社長:私の若いころは5MB/秒くらいでしたからね。20倍以上は高速化してます。まあネットワークのほうは100倍以上速くなりましたが。

開発:思うに、例えば100GBあるプログラムやデータの中で、本当に高速にアクセスする必要なものがどのくらいあるかということなんですが。典型的には10GBくらいしかないとすると、それはもうRAMに入ってしまう。めったにシャットダウンすることもないなら、ほとんどディスクにもアクセスしないことになりますね。

社長:複数の異なる性能のメモリとディスクがあるときに、何をどこに置くかという話ですね。長期的なアクセスパターンとかから自動的に最適化できると良いですね。

基盤:あ、縮小したHDD版VMのチェックポイント統合終了です。あとはHyper/Vで仮想ディスクを小さくすれば完成。今度はHDDからSSDにクローンして、そのSSD版でやってみます。おおっと、こういう単純読み出しだとHDDでも200MB/秒出ますね。まあ、ディスクがきれいだからほぼ整列しているんでしょうけど。


2020-0611 SatoxITS

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です