新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正
拟虚机调度器
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宠物商店 |
本章示例用应 |
|
JDK |
Java工具包 |
|
Tomcat |
Java用应服务器 |
|
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() {
String urlForJMX = "service:jmx:rmi:///jndi/rmi://10.1.58.64:1090/jmxrmi";
double memoryUsage = 0;
MBeanServerConnection jmxServerConnection = null;
try {
jmxServerConnection = JMXConnectorFactory
.connect(new JMXServiceURL(urlForJMX), null)
.getMBeanServerConnection();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
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");
memoryUsage = used/max;
} catch (Exception ex) {
ex.printStackTrace();
}
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) {
ExecuteCommand.execute("vmrun -T server -u "+userName+" -p "+passwd+" -h "+url
+" stop \"["+dataStore+"] "+ path +"/"+VMName+"\"");
}
}
ExecuteCommand.java
package com.skater.cloud.util;
import java.io.BufferedReader;
import java.io.InputStreamReader;
//执行命令行
public class ExecuteCommand {
public static void execute(String cmd) {
try {
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());
e.printStackTrace();
}
}
}
VMScheduler.java
package com.skater.cloud;
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");
}
}
}
}
代码编写成完,成生jar包。击双便可执行。
文章结束给大家分享下程序员的一些笑话语录: 一条狗在街上闲逛,看见橱窗里一张告示:「招聘程序员。会编程,有团队精神,至少精通两种语言。均等机会。」
那条狗就进去申请,但是被拒绝了。
「我不能雇一条狗在公司里做事。」经理说。
狗不服气,指着告示上「均等机会」几字抗议。
经理没法,叹了口气,不屑地问道:「你会编程吗?」
那条狗默默地走到电脑前,编了个程序,运作准确。
「你有团队精神吗?」经理问。
那条狗掉头看了看门外,一大群野狗在外面虎视耽耽。
「我真的不能雇狗做这份工作。」经理气急败坏地说。
「就算会编程、有团队精神,但是我需要的雇员至少要能精通两种语言。」
那条狗抬头看着经理说:「喵-噢。」