VirtualBox速度チューニングや仮想化関連のGUI設定手引き
ホストOSはWindows10、ゲストOSはワードプレスのVVVです。Virtualbox上のVVVもVCCWも遅くてデフォルトでは仕事にならない。VVVやVCCWが悪いわけではなく、ホストOSやVirtualBoxの設定と物理スペック次第だと思いたい、それで改善されて欲しい・・・。でも、プラグイン使い過ぎで、DBクエリが増えているだけの様な気もしています。そこはDebug barあたりで検証ですね。とりあえずVirtualBox Command Lineも使い、VirtualboxのGUIで出来る事を順番に見ていきます。
開発環境までクラウドを使うと毎月の固定費が超高い
日本は英語圏の多くの情報を参照する事が苦手、時代遅れ鎖国、悲しい現実。視野が狭い為、皆、国内のSNSやマスコミのコンテンツマーケに踊らされやすく、何でもクラウド移行!という風潮ですが、検証・開発環境までクラウドを使うと毎月の固定費が非常に高い。クラウドは沈黙のITヤクザ何も言わずに金をとっていく。
クラウドを使わず自社で運用基盤を作る企業
海外のIT系企業や日本で比較的に規模が大きいIT系企業などは、自社でベアメタルやプライベートクラウドなど、データセンターにPower(電源)、Connection(ネット接続)、(物理)Securityと場所代に対する料金のみを支払い、自社の技術者でIT基盤を運用してしまう事も珍しくないです。クラウド会社に余分なマージンを支払う必要が無く、クラウド会社が定める各種のラインセンス問題も無くなり、運営効率化やサービス自由度の拡大も出来る様になります。運用基盤の内製化は、規模が大きく技術者が多い企業ほど有利です。中小のサーバー会社が何でも自前で開発運用を行う様な感じです。クラウドは、従量課金なので運用規模が大きくなるほどコスト高な印象が大きくなります。脱クラウドで自社にてIT基盤の運用を行う企業は、今後も一定数で増え続けると思われます。NTTのデータセンターは一番堅い商売。「IT固定費の節約=運用基盤を根こそぎ自社で内製化」という図式は、規模が大きくなり、コストがかさむほど経営者の脳内を頻繁によぎる様になる。
零細中小企業で開発環境まで予算計画を立てられる顧客は少ない
開発環境の必要性に理解を得る事も難しい(無料セミナーって大切だな)。だから、ある程度技術がある会社なら仮想環境を自社で作る。手間が増えるので人件費は必要ですが、クラウド会社が中間で搾取する金額分は削減できる。Virtualboxも、あまり速くないですが内製化するための仮想化ソフトウェアのひとつ。弊社でも自社で仮想化して開発環境を構築する事があります。
セキュリティインシデントを経験している経営者
2016年から2017年にかけて、セキュリティインシデントのマスコミニュースが多いという事も有り、可用性確保向けにクラウドでDR環境を冗長化して持つことについて、非IT系の零細中小企業でも少~しずつ提案しやすくなってきている。危機管理意識が高い、アンテナが高い(セキュリティインシデント経験済)経営者には、たとえ年配であっても会話が刺さる。開発環境の構築についても価値を理解できる(見積を理解できる)良客。逃した(笑)。良客ということで盲目になり、初期価格設定を甘やかしすぎて早期に利益限界がきた。
ホストOSとゲストOSのスクリーン/ウィンドウの切替コントロール
ゲストOSのフルスクリーン化やウィンドウ操作をホストOSから切り替えて利用する場合、ゲストOSからの離脱コマンド(特に「右」+「Ctrl」)を絶対に紙にメモして、操作迷子になってもゲストOSからホストOSへの離脱コマンドがわかる状態で作業を行う事を強くお勧めします。ホストOSのコントロールに戻る場合、Windowsでは『矢印キー「右」+「Ctrl」』です。フルスクリーンからウインドウモードに切り替える場合は「Host(右Alt)+Fキー」です。フルスクリーン時に下部に隠れてしまうメニューバーにアクセスするには、「Host(右Alt)+Homeキー」です。フルスクリーン時に下部に隠れてしまうメニューバーは、マウスで引き上げる事も出来ます。
一般
VirtualBoxのGUI(VirtualBoxマネージャー)で仮想マシンノードの選択肢の真上で右クリック⇒『設定(S)』に進み、小ウィンドウで仮想マシンごとに様々な設定を行う事ができます。『高度(A)』タブに進むと、クリップボードの共有やドラッグ&ドロップの設定が出てきます。
vagrant up時の注意
vagrant upの時、Virtualboxで仮想マシンノードの選択肢の真上で右クリック⇒『設定(S)』の小ウィンドウを開きっぱなしだとvagrant up出来ない。設定の小ウィンドウはvagrant upする前に必ず閉じておく必要が有る。尚、vagrant upコマンドは後述の必須vagrantプラグインを入れた後に行う事を強く推奨します。
システム
マザーボード(M)
メインメモリー(M)を4MBから8192MBまで調整出来ます。20個以上のプラグインを使ってDBも100MB~500MB超えている様なワードプレスを動かす事を考えると4GBくらいは欲しい。VirtualBoxでは、ホストOSと複数のゲストOSでメモリバルーニングでメモリは共有されるので、ゲストかホストで空きメモリがある限り、ハードディスクへのスワップは起きないと考えられます。VirtualboxのGUIで設定するメモリだけでなく、Vagrantfile側のメモリを4096などに変えてください。Vagrantfile側の数字が優先されます。Windowsであれば『Ctrl+F』で『1024』や『memory』などを検索して書き換えてください。
ホストOSのメモリが少ない場合はどうしようもないので、16GB、32GBなど、ある程度、物理メモリを増やしておくことも大切。いざ、スワップを考えるとSSDなども用意しておくとベストかも。頑張ればメルカリで安く手に入る。ただ、ホストOSのCPUがボトルネックとなる場合も考えられ、さらに元をたどるとマザーボードに起因する拡張性、電源、ファンなど根深くて、新マシン購入以外にどうしようもない問題が出てくることもある。ホストマシンについては、よく調べてマザーボードレベルで拡張性の高いものを選ぶといいです。
チップセット
CPUをヒトの頭脳とすると、チップセットは各種の機能を動かす手足の様な位置づけで、デフォルトでは『Legacy』となっており、『PⅡX3』か『ICH9』を選択できる。『PⅡX3』もレガシーらしく、新しいものを選ぶ意味では『ICH9』しか選択肢がないです。
EFI(Extensible Firmware Interface)を有効化
OSとファームウェアのインターフェース仕様。UEFI(Unified Extensible Firmware Interface)とも言われる。Firmware/HardwareとOSloaderの間で動くらしい。当たり前っぽい。有効にしとくか。
プロセッサー(CPU)数
CPUの数を1~4まで変えられる。使用するコア数。いわゆる仮想CPU。ホストマシンが搭載しているコア数以上に設定可能ですが、当然ながらパフォーマンス悪化の可能性もある。ちなみにGPUもプロセッサ。プロセッサ数量変更する際、基本的に仮想マシンはOFFにしておく必要が有る。BIOSのIntel Virtualization Technology(仮想化支援技術 : 通称 Intel VT)がDisabledの場合、数を増やせない事があり、ホストOSと密接に関係している。ホストOS搭載CPU6コアに対して仮想CPUで9コアなどが出来、oversailing出来てしまう。レンタル共有サーバーがXENとは限らないが、仮想CPUがオーバー、かつゲストOSの数も目一杯でパフォーマンスが低くなりがちなゲストOSを割り当てられるかどうか?は運次第!経営者はよく知っているが、安くてラッキーお買い得はありえない。逆に、KVMでは制限機能があるため良心的な仮想基盤運営ができる。個人的に、仮想化基盤選びは、『仮想CPUの柔軟性』と『カーネル共有の有無』あたりの見極めが非常に大事だと考えています。
PAE/NXを有効化
PAEは Physical Address Extension(物理アドレス拡張)で、32ビットCPUで4Gバイトを超えるメモリーを扱うための機能。NXはNo-eXecute page protection。NXビットでセキュリティを強化する為に一応チェック(らしい)。必要なさそう。
アクセラレーション(L)における準仮想化インターフェイス(P)
BIOSのVT-x/AMD-Vハードウェアアクセレーション(仮想化支援機能)はおそらく問題無い。準仮想化は、仮想環境で動かすことを目的に、ゲストOSの一部を修正してから利用する方式。VirtualBox 5.0の設定では、ゲストOSがWindows系なら「Hyper-V」、Linux系なら「KVM」、OS Xなら「Minimal」を選ぶことがお決まりの様子。Ubuntu「Legacy」とUbuntu「KVM」で比較しても残念なことに大した違いは感じられない。
ディスプレイ
スクリーン(S)のビデオメモリー(M)について。割り当てを増やし(デフォルト12MBから128MB)、「3Dアクセラレーションを有効化(3)」を行う、最後にゲストOSのubuntuへ次のコマンドを行う。「3Dアクセラレーションを有効化(3)」はやらなくてもいい様な気がするけど、重要っぽい。
sudo bash -c 'echo vboxvideo >> /etc/modules'
ディスプレイ数について、バーチャルモニターの数の事でVirtualBoxは最大で8ついける。
ストレージ
光学ドライブやハードディスクの追加が出来る。ストレージの割当て、新規ストレージコントローラの追加も可能。ubuntuを使ってい容量が不足する問題に直面する人が多い様子・・・。容量追加はやや面倒な作業なのでクローンを作ってから行う事を推奨します。ホストマシンHDDの健康チェックはCrystalDiskInfoなどを使います。
vagrant初期設定時からインストールしておくべき必須vagrantプラグイン
- vagrant-hostsupdater
- vagrant-share
- vagrant-triggers
- vagrant-vbguest
VVVでこれらのどれかが欠けた状態だと、vagrant ssh後にプロンプトが表示されない問題が起きた(プロヴィジョニング時のエラーかもしれないけど・・・)。
※vagrant upの後にVirtualBox Command Lineのメニューバーで、「仮想マシン」⇒「セッション情報」⇒「ランタイム情報(R)」⇒「ランタイム属性」⇒「Guest Additions」でGuest Additionsバージョン確認が出来ます。Guest Additionsがインストールされていない場合は「未検出」と表示されるようです。
ネットワーク
ホストOSやゲストOSなどのネットワークに対するアダプターの割り当て種類(モード)を理解しておく必要が有る。がっつり見ていく場合、NetAdapter RepairやWiresharkを使って調査などもある様だ。
NAT(Network Address Translation)
デフォルトで設定されているNAT(Network Address Translation)は、ホストOSが使っているネットワークとは別でVitualBoxの内部に用意されたネットワークがゲストOSのネットワークとして割り当てられる。ポートフォワーディングの設定ができる。
ホストオンリーアダプター
ホストオンリーアダプターは、ゲストOSとホストOS間のみ通信ができる閉じたネットワーク、外部との通信はできない。ホストとゲスト間のVPNやAWS Direct ConnectやAzure Express Routeといった感じに近いと思われる。
仮想マシンイメージのデフォルトでは、上記の2つのネットワークアダプターが設定されている事が多い。最大4つまでネットワークアダプターを設定できる。
シリアルポート
COMポートとも言われる。Dサブコネクタ9ピンや25ピンなど、ヒロセ電機のHDシリーズと言ったところだと思う。PCと周辺機器、あるいはPC同士を接続するためのシリアル通信インタフェース。データを逐次(順次)送り出す方式。RS-232C等の通信規格も絡んでくる。この記事を書いているPCのデイスプレイ接続は、未だにDサブ9芯(笑)。映像系の通信が関連しやすそう。昔ながら安定のベストセラー9芯と言えよう。VirtualBoxの場合は仮想シリアルポートやホストOS側のポートなどで、ポートの設置やポートの番号決めなど、なかなかややこしい。シリアルポートの出番は、物理環境と仮想環境でネットワークを作るとか、仮想環境に対してレアな使い方をする場合に限られると思われる。
USB
ゲストOSにUSB接続でデバイス認識させたい、デバイスマウントしたい場合など。仮想マシンでプリンタ接続などもある。普通に業務で使うPCを仮想化で立ち上げている場合、USB接続したい機器は多い。VirtualBoxにExtension Packをインストールしたり、VirtualBoxを起動する際の作業のユーザーをvboxuserグループに入れたり、USBポートを専有するOSを変更したり、VirtualBoxの起動/終了をしたり、ゲストOSの仮想マシンの起動/終了をしたり、USB機器を抜き差ししたりします。抜き差しのタイミングがかなり重要らしく、ハマる様です。USBメモリからOSブートも出来るらしい。
共有フォルダー
ホストOSとゲストOSでフォルダーを共有する。ちなみに、vagrant ssh後、vagrantフォルダが実は既にデフォルトで共有されています。ゲストOSのvagrantフォルダにドキュメントルートのシンボリックリンクを張るのもいいと思います。他にもホストOSとゲストOSであなた好みの設定で共有する方法もある。vagrantのプラグインにも似たような機能のやつがあった気がする・・・。
ユーザーインターフェイス
仮想マシン・ウィンドウのメニューを設定する。VM VirtualBox Guest Additionsを入れてから、フルスクリーン表示などの設定が出来る。
スナップショット
その時点の仮想マシンのイメージを作る。復元する時には過去の時点のもの。
クローン
スナップショットや仮想マシンからクローンして仮想マシンを立ち上げる。オリジナルに対するコピー。
- すべてをクローン⇒設定ファイルからディスクドライブファイルまで全てをコピー。
- リンクしたクローン⇒クローン元の現在のディスクドライブファイルを基にして、その差分のみでクローン先 (コピー先) のディスクドライブファイルを構成。
ホストOSのウィルス対策ソフト
仮想マシンの中までウイルススキャンされると遅くなる可能性がある。仮想マシンディレクトリをウイルス対策ソフトの除外リストに加える設定も試したが効果無し。Windows Defenderという話もあるが、さすがにOFFにはできない。AdwCleanerやMalwareBytes Anti-Malware (MBAM)を使うというのもあるが、おそらく違う、的がずれている。
Windows 10 works slowly on Virtualbox. How to speed up?を見ると、どうやらWindows10×Virtualboxが鬼門の様だ。過去を思い出すと、可能性論ではあるがWindows8.1の時は普通に開発に使えていた。がWidnows10では開発利用不可能レベルで激遅い。大きな差はWindows Defender?でも、Windows Defenderは無効化したくない。実験すらしていない。LANケーブル抜いてやってみるしかないか。めんどくさい。
ホストOSマシンのデフラグ、HDD回転数
デフラグは週1でwindowsが勝手にやってくれていた。手動でも数時間できちんとデフラグ終わる。今回のHDDは7200rpm。ディスクI/Oのボトルネックも考えられる。SSDに変えるとIOPSがはるかに向上するので、このあたりも要検討。CPUの処理速度とHDDのディスクへの書き込み速度の差は大きい。
Windows10上のVirtualboxはめちゃくちゃ遅いのかも
本格的にボトルネック調査するしかない。マジで仕事が進まねぇ。F〇ck!!どうやら仮想マシンのプロビジョニング時にディスクのサイズを30GBとかにする方法があるらしい。でも、一度、プロビジョニングを行った仮想マシンは、スナップショットに形を一旦変えてディスクを大きくして立ち上げる必要が有る。phpソースコードとかMySQLスロークエリログとかの検証か・・・。CPU使用率、メモリ不足、ディスクI/O、TCPコネクション数、ネットワークI/O、NFS(Network File System)、などのボトルネック調査か・・・。いまどき、こんなことする人、いるのだろうか?と、収益性の遠さから思ってしまいましたが、Go back to Basicsです。アプリケーションを最後に支えるのは人間なんだと改めて反省させられました。時間をみつけてトライしたい、予算と時間の問題って難しい。そろそろ選択と集中しないと。
ざっくりと主要な調査箇所を分類すると、CPU、メモリ、DiskIO、ネットワークの4か所です。
他、VirtualBoxではなく、VMware、Hyper-V(Windows10 home 64bitは不可Windows10 ProならHyper-V使える)、Xenなどを使えという話もあります。ただ、VitrualboxとHyper-Vについて、Hyper-VではIntel VT-xが無効化されるため同じホストOSで共存出来ないので、Vitrualbox/Vagrantの開発環境たちを一掃する事になる。
サーバー会社の社長さんと話をしていても、WindowsOS(IIS)は遅い(私の場合はチューニングを知らないだけ?)、という話は出る。ホストOSがWindowsなら、Hyper-Vの上にLinuxゲストOSというのがベターな開発環境だと思われる。
ちなみに、VirutalBox very slow unbearable on windows10 host とかでググると、ゲストOSがWindows10なのかホストOSがWindows10なのかめっちゃメンドクサイ検索結果が英語でたくさん出てくる。
海外の英語のVirtualboxのGUIチューニング記事も読んで、総なめして書きました(つもり・・・)
この記事見て頂いている方、うちのブログの割にちょっとだけ多いです(笑)。VCCWやVVVなどWordpress系の方による閲覧が多いのでしょうか?フレームワークや他のCMS開発の方もいるのでしょうか?ブログを通してエンジニアの方と対話できるのはとても嬉しいです。Wordpressに関しては、Windows10 homeのVirtualboxでは、ちょっとヘビーな開発をしようとすると、SQLクエリなどが多かったり、プラグインのphpソースコード品質などの影響で、パフォーマンスを出しにくくなってきているのかもしれませんね、知らんけど(笑)。プラグインのパフォーマンスなど品質見極めの重要性が増しますね。一般顧客から理解を得にくい開発コストが上がるので、開発受託脱却して内製開発オンリーで勝負だ!という流れがますます正しい気がしてきました。うちはローカルの仮想化環境でWordpress開発はやらなくなりました。開発環境の費用もきちんと顧客に請求します。KUSANAGIは偉大ですね。おそらく、Go Back to Basicsに基づいて細かいボトルネック調査もしながら、ディストリビューション開発、マーケティングを行って来られたのでしょう。ごいす~です。
他人があまり手を出さないけど、実はニーズが高く難しい分野で攻める!みたいな感じですね。非常に勉強になりました。