天天看點

Java程式員也應該知道的系統知識系列之虛拟化

作者:林昊

Java程式員也應該知道的系統知識系列之虛拟化

如今伺服器的配置越來越高端,對于java應用而言,通常很難充分利用實體機資源,這其實并不是說java本身沒法做到用那麼多的資源,而是因為通常java是用于實作應用,應用很多的情況下對記憶體、cpu的需求都不會太高,這就使得我們需要有一些辦法來充分提升機器的資源使用,虛拟化就是其中一種常用的方法。

虛拟化簡單來說就是把一台實體機虛拟為n台機器,對于使用者而言通常會覺得虛拟機和一台單獨的機器沒什麼差別。

對于伺服器的虛拟化而言,具體關于實作虛拟化的技術像pv/fv等這些就不在這裡講了,感興趣的同學可以自行google。

用來實作伺服器虛拟化中比較好的産品是xen,xen的成熟度很高,易操作比較穩定性不錯,用xen可以很簡單的在一台實體機上建立n個虛拟機。

cpu的話為每個虛拟機配置設定的其實都是virtual的,也就是多個虛拟機可能共用一個cpu,這也是為什麼有些虛拟機上會看到%st這個名額是有值的,這個值表示的就是多個虛拟機共用一個cpu的時候,被其他虛拟機用掉的cpu,對于一些敏感的場景,可通過綁定cpu的方式來做到隔離,避免互相影響,但相對來說這樣的使用率就不能發揮錯峰填谷了,在運作過程中可通過xen的管理工具來動态的調整cpu的綁定,建立的虛拟機的cpu core數隻能在在設定的最大cpu個數範圍内調整。

從上面可以看到,可以認為cpu不是一台機器能建立的xen虛拟機的瓶頸因素,瓶頸因素為記憶體,xen比較難實作記憶體的共享,是以在建立了虛拟機後,配置設定給它的記憶體就占用了,要實作共享的話會對虛拟機的性能有一定的影響,是以通常來說一般是不會開啟的,從這可以看到,如果對于cpu利用不多但記憶體用的比較多的場景而言,xen虛拟化能提供的幫助是有限的。

磁盤/網絡的io通常是不做隔離的,也就是所有的虛拟機共用,這也是為什麼有些時候大家會碰到io hang住後實體機上所有的虛拟機全都受影響,通常可做的是限制磁盤的容量、網絡的流量。

目前的虛拟化技術已經非常成熟,對比虛拟機的性能和直接在實體機上跑的性能,差距也很小(通常看到差距比較大是因為實體機上跑的虛拟機比較多),當然,這還和虛拟機上跑的應用類型有關。

對于較多機器的情況下,怎麼合理的規劃虛拟化,其實是個比較複雜的話題,例如虛拟比到底為多少、虛拟機的ip怎麼設計、實體機/虛拟機挂了的情況下怎麼處理等等,這些話題就不在這裡展開講了。

除了xen以外,其實還有很多其他的方案,其中現在用的比較多的還有kvm、lxc,kvm的話在gae上有使用,lxc比較特殊,是以在這裡還是稍微講下。

lxc相對xen/kvm而言,其實不能算是完整的虛拟化,lxc其實就是實體機上的一個程序,隻支援linux,是以建立出來的虛拟機是沒有獨立的os的,但可以用獨立的使用者體系、ip等,官方的lxc版本建立出來的虛拟機,登入進去後看到的實體資源等都是實體機的,如果要讓它想一個真正的虛拟機,需要從核心層面做一些改造,lxc帶來的好處是可以動态的調整cpu的搭配、個數,并且記憶體超配也是ok的,這樣對于一些場景而言使用率的提升就比較明顯了,感興趣的同學可以去搜下我以前在qcon上講過的一個t4的産品,是基于lxc的。

提升使用率是個比較大的話題,虛拟化是其中的一個技術點,但涉及的點其實還有很多,google borg是提升使用率中“神”級的産品,但目前資料非常少,感興趣的可以看下我之前寫過的一篇我猜測的borg。

随着硬體的不斷發展,之後的pc server的配置将會比現在高很多,到了那個時候,如何提升機器使用率就是個更複雜的話題,一台實體機上跑的虛拟機太多的話也不太适合,主要的是實體機挂了影響會比較明顯,是以如何在虛拟比到達上限的情況下有效的提升使用率會是再過幾年要面臨的大話題。