天天看點

虛拟機、使用者-虛拟機排程器的研發-by小雨

虛拟機排程器

1. Java寵物商店簡介

span style="font-family

新手發帖,很多方面都是剛入門,有錯誤的地方請大家見諒,歡迎批評指正

    拟虛機排程器

    1. Java寵物商店簡介

        寵物商店(JPetStore)最初是Sun公司基于Java EE台平發開的一個實作例實,它給出了一個完全的寵物商店例實。使用者幾乎不必修改以可就直接用使這個用應來營運自己的網上寵物商店。

    1.1 環境備準

           件硬備設:一台電腦,4G存内,作操系統是Windows 7。

           環境搭建驟步:

    1.      裝安VMware Server;

    2.      在VMware Server上建立一個拟虛機,作操系統是Windows XP;

    3.      在Windows XP系統中裝安JDK;

    4.      在Windows XP系統中裝安Tomcat;

    5.      測試JDK、Tomcat是不是常正裝安。

           下邊給出所需軟體的載下位址:

軟體名稱 說明 載下位址
Java寵物商店 本章示例用應 http://mybatis.google.com
JDK Java工具包 http://java.sun.com
Tomcat Java用應伺服器 http://tomcat.apache.org
VMware Server 拟虛機伺服器 http://www.vmware.com/products/server

    1.2 部署Java寵物商店

           首先運作Tomcat

           在浏覽器中入輸http://127.0.0.1:8080/manager/html回車

      點選最下邊的浏覽,選擇寵物商店的war件文,點選部署。

           最後在浏覽器中入輸http://127.0.0.1:8080/mybatis-jpetstore-6.0.0進入寵物店首面頁

           此時,區域網路内的使用者也可以拜訪寵物商店,需隻把IP位址改成伺服器的位址。

    2. 寵物商店拜訪速度測試

           在成完用應序程的部署後之,須要停止測試,以檢測序程是不是能滿意我們的要求。本文我們隻對首頁的拜訪速度停止測試。

           本文用使的測試工具是JMeter。載下位址:http://jakarta.apache.org/jmeter/載下後停止裝安。裝安成完打開,首頁如下圖所示。

    3. 針對測試結果進改用應

           經過面上的測試,可以看到當同時有100個使用者并發拜訪寵物商店時,均勻225ms才能拜訪網站的首頁。使用者可能因為拜訪速度過慢而棄放拜訪。人們可以強增器機的性能,進步應相的速度。

           由于用使拟虛機搭建運作環境,是以可以變動拟虛機的置配來進步拟虛機的性能。上邊的測試,拟虛機的存内為128M,當初我們将存内改成512M。新重測試,可以看到均勻拜訪時間為73ms。      

           進步用應序程的拜訪速度,除了進步伺服器性能外,我們還可以增長伺服器的數量,來擔分拜訪量。但與此同時,部署用應序程所須要的算計源資也越來越多了,尤其是當拜訪量比較低時,仍要運作兩台拟虛機就顯得有些浪費源資(在雲算計環境中,一般按照用使的算計源資量來收費,多用使拟虛機象征花着更多的錢金)。

           如果用應序程可以在使用者拜訪量增大時增長恰當的算計源資,而在拜訪量少減時,釋放過剩的算計源資,那麼就即達到了進步使用者拜訪速度的要求,又勤儉了無限的資金。

    4. 拟虛排程器的計劃

           根據面上的分析,有兩方面的需求:

    1.      監控使用者拜訪量;

    2.      根據使用者的拜訪量增長或少減用應伺服器的數量。

    4.1 監控使用者拜訪量

           監控使用者拜訪量有很多法辦,比如設定網絡技術期,監控量流。但形成使用者拜訪變慢的直接原因往往是主機存内用使率及CPU用使率的升上。針對此況情,Java拟虛機供給了一個專門的監測工具JMX(Java Management Extensions,即Java管理擴充)。Java發開工具中的JConsole供給了圖形化的監控界面。

    4.2 增長或少減伺服器數量

           VMware Server供給了一套VMware VIX程式設計接口及應相的指令行序程作操,共發開人員編寫序程用使。VIX程式設計接口隻支撐Perl和COM語言。但我們可以用使Java語言來實作制控拟虛機的數量,我們可以用使Java序程調用指令行。

           拟虛機的開啟和關閉指令如下。

           vmrun –T server – u <User Name> -p XXX –hhttp://127.0.0.1:8333/sdk start “[vmwaredatastore] winxp/Windows XP.vmx”

           vmrun –T server – u <User Name> -p XXX –hhttp://127.0.0.1:8333/sdk stop “[vmwaredatastore] winxp/Windows XP.vmx”

    4.3 拟虛排程器的實作

    代碼如下:

    JMXClient.java

package com.skater.cloud;

import java.io.IOException;

import java.net.MalformedURLException;

import javax.management.MBeanServerConnection;

import javax.management.ObjectName;

import javax.management.openmbean.CompositeDataSupport;

import javax.management.remote.JMXConnectorFactory;

import javax.management.remote.JMXServiceURL; 

public class JMXClient {

       public JMXClient() {

              super();

       }

       public static void main(String[] args) throws Exception {

              String urlForJMX = "service:jmx:rmi:///jndi/rmi://10.1.58.64:1090/jmxrmi";

              MBeanServerConnection jmxServerConnection = JMXConnectorFactory

                            .connect(new JMXServiceURL(urlForJMX), null)

                            .getMBeanServerConnection(); 

              try {

                     String[] domains = jmxServerConnection.getDomains();

                     for (String domain : domains){

                            System.out.println(domain);

                     }

            ObjectName memory = new ObjectName("java.lang:type=Memory");        

            CompositeDataSupport comp = (CompositeDataSupport)jmxServerConnection.getAttribute(memory, "HeapMemoryUsage");     

            double max = (Long)comp.get("max");

            double used = (Long)comp.get("used");

            System.out.println(used/max);

              } catch (Exception ex) {

            ex.printStackTrace();

              }

        public static double getMemoryUsage() {

        double memoryUsage = 0;

              MBeanServerConnection jmxServerConnection = null;

                     jmxServerConnection = JMXConnectorFactory

                                   .connect(new JMXServiceURL(urlForJMX), null)

                                   .getMBeanServerConnection();

              } catch (MalformedURLException e) {

                     e.printStackTrace();

              } catch (IOException e) {

            CompositeDataSupport comp = (CompositeDataSupport)jmxServerConnection.getAttribute(memory, "HeapMemoryUsage");          

            memoryUsage = used/max;

              return memoryUsage;

}

    OperateVM.java

package com.skater.cloud.util;

//作操拟虛機

publicclass OperateVM {

    publicstaticvoid startVM(String userName, String passwd, String url, String dataStore,String path, String VMName) {

       ExecuteCommand.execute("vmrun -T server -u "+userName+" -p "+passwd+" -h "+url

                            +" start \"["+dataStore+"] "+ path +"/"+VMName+"\"");

    }

    publicstaticvoid stopVM(String userName, String passwd, String url, String dataStore,String path, String VMName) {

                              +" stop \"["+dataStore+"] "+ path +"/"+VMName+"\"");

    ExecuteCommand.java

 import java.io.BufferedReader;

import java.io.InputStreamReader;

//執行指令行

public class ExecuteCommand {

        public static void execute(String cmd) {

                     Runtime rt = Runtime.getRuntime();

                     Process pr = rt.exec(cmd);

                     BufferedReader input = new BufferedReader(new InputStreamReader(pr

                                   .getInputStream()));

                     String line = null;

                     while ((line = input.readLine()) != null) {

                            System.out.println(line);

                     int exitVal = pr.waitFor();

                     System.out.println("Exited with error code " + exitVal);

              } catch (Exception e) {

                     System.out.println(e.toString());

    VMScheduler.java

 import com.skater.cloud.util.OperateVM;//拟虛機排程器

publicclass VMScheduler {

    publicstaticvoid main(String args[]) {

        while (true){

        double memoryUsage=0;     

        try {

            memoryUsage =  JMXClient.getMemoryUsage();     // 每隔5分鐘檢視一次存内用使況情

              Thread.sleep(5*60*1000);

           } catch (InterruptedException e) {

              e.printStackTrace();

           }

           if(memoryUsage>0.2){

              OperateVM.startVM("administrator",".", "https://127.0.0.1:8333/sdk","standard", "winxp2_1", "winxp2.vmx");

           }else{

              OperateVM.stopVM("administrator",".", "https://127.0.0.1:8333/sdk","standard", "winxp2_1", "winxp2.vmx");

        }