forked from KNEMC/KLALB
KLALB 3.6.0开发一半的状态
This commit is contained in:
@@ -1,39 +1,23 @@
|
||||
package org.kne.cloud.network.perf;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.InetAddress;
|
||||
import java.nio.channels.UnresolvedAddressException;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.PriorityBlockingQueue;
|
||||
import java.util.concurrent.locks.LockSupport;
|
||||
|
||||
import org.kne.cloud.clock.AdjustedNanoClock;
|
||||
import org.kne.cloud.clock.HighAccuracyClock;
|
||||
import org.kne.cloud.network.MultipurposeSocketAddress;
|
||||
import org.kne.cloud.network.SpeedLimiter;
|
||||
import org.kne.cloud.network.ThreadTool;
|
||||
import org.kne.cloud.network.ipv6.IPv6Packet;
|
||||
import org.kne.cloud.network.ipv6.PacketID;
|
||||
import org.kne.cloud.network.ipv6.PacketIDGenerator;
|
||||
import org.kne.cloud.network.ipv6.IPv6AddressGroup;
|
||||
import org.kne.cloud.network.klalb.ADDRPacket;
|
||||
import org.kne.cloud.network.klalb.ADDRREQPacket;
|
||||
import org.kne.cloud.network.klalb.BWINFPacket;
|
||||
import org.kne.cloud.network.klalb.IPv6OverKLALBPacket;
|
||||
import org.kne.cloud.network.klalb.KLALBPacket;
|
||||
import org.kne.cloud.network.klalb.KLALBPacketLink;
|
||||
import org.kne.cloud.network.klalb.KLALBUtils;
|
||||
import org.kne.cloud.network.klalb.PINGPacket;
|
||||
import org.kne.cloud.network.klalb.PONGPacket;
|
||||
import org.kne.cloud.network.klalb.VADDRACKPacket;
|
||||
import org.kne.cloud.network.klalb.VADDRPacket;
|
||||
import org.kne.cloud.network.klalb.VADDRREQPacket;
|
||||
import org.kne.cloud.network.monitor.MonitorData;
|
||||
import org.kne.cloud.network.monitor.LinkStatus;
|
||||
import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl;
|
||||
|
||||
import com.github.f4b6a3.uuid.UuidCreator;
|
||||
import org.kne.concurrent.ThreadParker;
|
||||
|
||||
public class Kperf implements Runnable{
|
||||
|
||||
@@ -52,11 +36,13 @@ public class Kperf implements Runnable{
|
||||
private MultipurposeSocketAddress bindAddress;
|
||||
private volatile boolean connected=false;
|
||||
private volatile KLALBPacketLink link;
|
||||
|
||||
private LinkStatus status=new LinkStatus();
|
||||
private SpeedAndTrafficAndDelayMonitorDataImpl monitor=new SpeedAndTrafficAndDelayMonitorDataImpl(HighAccuracyClock.SYSTEM_CLOCK);
|
||||
|
||||
private volatile boolean closed = false;
|
||||
|
||||
private volatile Thread tlock;
|
||||
private volatile ThreadParker tlock=new ThreadParker();
|
||||
public Kperf(MultipurposeSocketAddress targetAddress,MultipurposeSocketAddress bindAddress) {
|
||||
Objects.requireNonNull(targetAddress);
|
||||
this.targetAddress=targetAddress;
|
||||
@@ -90,9 +76,6 @@ public class Kperf implements Runnable{
|
||||
private SpeedLimiter test = new SpeedLimiter(MIN_SPEED,10000000L);
|
||||
|
||||
private static long MIN_SPEED=64*1024L;
|
||||
private SpeedLimiter congress = new SpeedLimiter(10000000L);
|
||||
private long congressSpeed = 0;
|
||||
private double loadPercent = 1.01;
|
||||
|
||||
|
||||
|
||||
@@ -101,10 +84,46 @@ public class Kperf implements Runnable{
|
||||
private long starttime=System.nanoTime();
|
||||
long totaltime=1000;
|
||||
long usedtime=0;
|
||||
|
||||
|
||||
private MonitorUpdater monitorUpdater;
|
||||
private class MonitorUpdater implements Runnable{
|
||||
@Override
|
||||
public void run() {
|
||||
while (!closed) {
|
||||
status.updateReliability();
|
||||
monitor.update();
|
||||
try {
|
||||
Thread.sleep(1);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//kperf {KLALB_Stream}[2486:1:f189:7589:f1f7:6f5e:b2eb:1]:4564
|
||||
//kperf {KLALB_Stream}[2486:1::8888]:4564
|
||||
@Override
|
||||
|
||||
|
||||
|
||||
public void run() {
|
||||
|
||||
Thread tcc = ThreadTool.makeVDaemonThreadIfSupport("测速控制线程", () -> {
|
||||
long startTime=System.nanoTime();
|
||||
try {
|
||||
System.out.println("time\tspd↑\tspd↓\tPPS↑\tPPS↓\tdelay↑\tdelay↓\tjitter↑\tjitter↓");
|
||||
while(!closed) {
|
||||
System.out.printf("%.2fs\t%s\n", (System.nanoTime()- startTime)/1000000000.0,monitor.toString());
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
}
|
||||
});
|
||||
Thread tc = ThreadTool.makeVDaemonThreadIfSupport("测速控制线程", () -> {
|
||||
final int wtimes=5;
|
||||
totaltime=(20*1000*1+20*1000*4+wtimes*1000*5)*1000000L;
|
||||
@@ -113,12 +132,10 @@ public class Kperf implements Runnable{
|
||||
try {
|
||||
long startTime;
|
||||
|
||||
System.out.println("测试1/5:延迟测试");
|
||||
System.out.println("测试1/3:延迟测试");
|
||||
test.setLimitspeed(0);
|
||||
startTime=System.nanoTime();
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("上传延迟:%.3fms 下载延迟:%.3fms\n", monitor.getOutDelay()/1000000.0,monitor.getInDelay()/1000000.0);
|
||||
Thread.sleep(1000);
|
||||
updateUsedTime();
|
||||
}
|
||||
@@ -133,131 +150,39 @@ public class Kperf implements Runnable{
|
||||
|
||||
|
||||
startTime=System.nanoTime();
|
||||
if(targetAddress!=null) {
|
||||
System.out.println("测试2/5:下载带宽测试");
|
||||
test.setLimitspeed(0);
|
||||
testPacket=new TESTNPacket(60000);
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("下载带宽:%s/s\n", KLALBUtils.convertIBUint(monitor.getInSpeed()));
|
||||
|
||||
System.out.println("测试2/3:带宽测试");
|
||||
test.setLimitspeed(1000L*1024L*1024L*1024L);
|
||||
testPacket=new TESTNPacket(65535);
|
||||
for (int i = 0; i < 60; i++) {
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
|
||||
System.out.printf("下载带宽:%s/s",KLALBUtils.convertIBUint(monitor.getInSpeed()));
|
||||
System.out.printf("上传带宽:%s/s\t",KLALBUtils.convertIBUint(monitor.getOutSpeed()));
|
||||
System.out.printf("下载带宽:%s/s\n",KLALBUtils.convertIBUint(monitor.getInSpeed()));
|
||||
if(reports!=null) {
|
||||
reports.downloadSpeedFinish(monitor.getInSpeed());
|
||||
}
|
||||
}else {
|
||||
System.out.println("测试2/5:上传带宽测试");
|
||||
test.setLimitspeed(1000L*1024L*1024L*1024L);
|
||||
testPacket=new TESTNPacket(60000);
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("上传带宽:%s/s\n", KLALBUtils.convertIBUint(monitor.getOutSpeed()));
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
System.out.printf("上传带宽:%s/s\n",KLALBUtils.convertIBUint(monitor.getOutSpeed()));
|
||||
if(reports!=null) {
|
||||
reports.uploadSpeedFinish(monitor.getOutSpeed());
|
||||
}
|
||||
}
|
||||
System.out.println("等待时间"+wtimes+"s");
|
||||
Thread.sleep(wtimes*1000);
|
||||
|
||||
|
||||
|
||||
startTime=System.nanoTime();
|
||||
if(targetAddress!=null) {
|
||||
System.out.println("测试3/5:上传带宽测试");
|
||||
test.setLimitspeed(1000L*1024L*1024L*1024L);
|
||||
testPacket=new TESTNPacket(60000);
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("上传带宽:%s/s\n", KLALBUtils.convertIBUint(monitor.getOutSpeed()));
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
System.out.printf("上传带宽:%s/s\n",KLALBUtils.convertIBUint(monitor.getOutSpeed()));
|
||||
if(reports!=null) {
|
||||
reports.uploadSpeedFinish(monitor.getOutSpeed());
|
||||
}
|
||||
}else {
|
||||
System.out.println("测试3/5:下载带宽测试");
|
||||
test.setLimitspeed(0);
|
||||
testPacket=new TESTNPacket(60000);
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("下载带宽:%s/s\n", KLALBUtils.convertIBUint(monitor.getInSpeed()));
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
System.out.printf("下载带宽:%s/s\n",KLALBUtils.convertIBUint(monitor.getInSpeed()));
|
||||
if(reports!=null) {
|
||||
reports.downloadSpeedFinish(monitor.getInSpeed());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
System.out.println("等待时间"+wtimes+"s");
|
||||
Thread.sleep(wtimes*1000);
|
||||
|
||||
|
||||
startTime=System.nanoTime();
|
||||
if(targetAddress!=null) {
|
||||
System.out.println("测试4/5:下载包转发率测试");
|
||||
test.setLimitspeed(0);
|
||||
testPacket=new TEST1Packet();
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("下载包转发率:%sPPS\n", KLALBUtils.convertUintDefalut(monitor.getInPPS()));
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
if(reports!=null) {
|
||||
reports.downloadPPSFinish(monitor.getInPPS());
|
||||
}
|
||||
}else {
|
||||
System.out.println("测试4/5:上传包转发率测试");
|
||||
test.setLimitspeed(1000L*1024L*1024L*1024L);
|
||||
testPacket=new TEST1Packet();
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("上传包转发率:%sPPS\n", KLALBUtils.convertUintDefalut(monitor.getOutPPS()));
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
if(reports!=null) {
|
||||
reports.uploadPPSFinish(monitor.getOutPPS());
|
||||
}
|
||||
}
|
||||
System.out.println("等待时间"+wtimes+"s");
|
||||
Thread.sleep(wtimes*1000);
|
||||
|
||||
startTime=System.nanoTime();
|
||||
if(targetAddress!=null) {
|
||||
System.out.println("测试5/5:上传包转发率测试");
|
||||
System.out.println("测试3/3:包转发率测试");
|
||||
test.setLimitspeed(1000L*1024L*1024L*1024L);
|
||||
testPacket=new TEST1Packet();
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("上传包转发率:%sPPS\n", KLALBUtils.convertUintDefalut(monitor.getOutPPS()));
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
|
||||
if(reports!=null) {
|
||||
reports.uploadPPSFinish(monitor.getOutPPS());
|
||||
}
|
||||
}else {
|
||||
System.out.println("测试5/5:下载包转发率测试");
|
||||
test.setLimitspeed(0);
|
||||
testPacket=new TEST1Packet();
|
||||
for (int i = 0; i < 20; i++) {
|
||||
System.out.printf("%.2fs\t", (System.nanoTime()- startTime)/1000000000.0);
|
||||
System.out.printf("下载包转发率:%sPPS\n", KLALBUtils.convertUintDefalut(monitor.getInPPS()));
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
if(reports!=null) {
|
||||
reports.downloadPPSFinish(monitor.getInPPS());
|
||||
}
|
||||
|
||||
reports.downloadPPSFinish(monitor.getInPPS());
|
||||
}
|
||||
System.out.println("等待时间"+wtimes+"s");
|
||||
Thread.sleep(wtimes*1000);
|
||||
|
||||
|
||||
|
||||
} catch (InterruptedException e) {
|
||||
//System.out.println("测速被中断!");
|
||||
@@ -269,7 +194,7 @@ public class Kperf implements Runnable{
|
||||
}
|
||||
});
|
||||
try {
|
||||
monitor.setState(MonitorData.UNSTABLE);
|
||||
status.setState(LinkStatus.UNSTABLE);
|
||||
if(link==null)
|
||||
link=KLALBUtils.createKLALBPacketLink(bindAddress, targetAddress,false,20000);
|
||||
|
||||
@@ -278,18 +203,12 @@ public class Kperf implements Runnable{
|
||||
|
||||
|
||||
Thread t = ThreadTool.makeVDaemonThreadIfSupport("测速发送线程", () -> {
|
||||
tlock = Thread.currentThread();
|
||||
try {
|
||||
KLALBPacket kpp = null;
|
||||
|
||||
while ((!link.isClosed()) && (!closed)) {
|
||||
// TimeDebugger tdb=new TimeDebugger();
|
||||
// tdb.putTime("start");
|
||||
if(checkBandwidthReportTime()) {
|
||||
writePacketToKPL(new BWINFPacket(monitor.getOutSpeed(), monitor.getInSpeed()));
|
||||
}
|
||||
if (checkPingTimeSleep()) {
|
||||
writePacketToKPL(new PINGPacket(System.nanoTime(),monitor.getOutSpeed(), monitor.getInSpeed()));
|
||||
writePacketToKPL(new PINGPacket(System.nanoTime(),0, 0));
|
||||
|
||||
}else {
|
||||
KLALBPacket kpip = IsendDequeList.poll();
|
||||
@@ -305,12 +224,10 @@ public class Kperf implements Runnable{
|
||||
|
||||
|
||||
}else {
|
||||
LockSupport.parkNanos(1000000);
|
||||
tlock.parkNanos(1000000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Thread.yield();
|
||||
}
|
||||
} catch (IOException | UnresolvedAddressException e) {
|
||||
if (debug)
|
||||
@@ -334,19 +251,20 @@ public class Kperf implements Runnable{
|
||||
}
|
||||
switch (kpp.getType()) {
|
||||
case KLALBPacket.PING:
|
||||
sendIPacket(new PONGPacket(((PINGPacket) kpp).getTime() ,kpp.getRcvtime(), System.nanoTime(),monitor.getOutSpeed(), monitor.getInSpeed()));
|
||||
sendIPacket(new PONGPacket(((PINGPacket) kpp).getTime() ,kpp.getRcvtime(), System.nanoTime(),0, 0));
|
||||
break;
|
||||
case KLALBPacket.PONG:
|
||||
if (fst) {
|
||||
// coll.resetCoolingTime();
|
||||
|
||||
monitor.setState(MonitorData.UP);
|
||||
status.setState(LinkStatus.UP);
|
||||
connected=true;
|
||||
if(targetAddress!=null) {
|
||||
System.out.println("连接地址"+targetAddress+"成功!");
|
||||
}else {
|
||||
System.out.println("接受地址"+link.toString()+"连接成功!");
|
||||
}
|
||||
tcc.start();
|
||||
tc.start();
|
||||
fst = false;
|
||||
}
|
||||
@@ -383,41 +301,24 @@ public class Kperf implements Runnable{
|
||||
adjnc.getLock().unlock();
|
||||
}
|
||||
|
||||
if (DsndDelayFactor >= 0 && DrcvDelayFactor >= 0) {
|
||||
//pingInterval = monitor.getLatencyAvg()+2000000L;
|
||||
|
||||
//double load = 1 - monitor.getOutDelayMin() / (double) monitor.getOutDelay();
|
||||
loadPercent =Math.max( 1.2,0.4);
|
||||
}
|
||||
|
||||
LockSupport.unpark(tlock);
|
||||
tlock.unpark();
|
||||
updateUsedTime() ;
|
||||
if(reports!=null)
|
||||
reports.updateDial(monitor);
|
||||
break;
|
||||
case KLALBPacket.BWINF:
|
||||
BWINFPacket bwi = (BWINFPacket) kpp;
|
||||
if (bwi.getDownSpeed() >= congressSpeed) {
|
||||
congressSpeed = bwi.getDownSpeed();
|
||||
} else {
|
||||
congressSpeed = (congressSpeed * 999 + bwi.getDownSpeed()) / 1000;
|
||||
}
|
||||
congress.setLimitspeed(Math.max(MIN_SPEED,(long) (congressSpeed * loadPercent)) );
|
||||
// System.out.println(congressSpeed);
|
||||
break;
|
||||
case KLALBPacket.TESTN:
|
||||
break;
|
||||
}
|
||||
Thread.yield();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
if(monitor.getState()==MonitorData.UNSTABLE)
|
||||
if(status.getState()==LinkStatus.UNSTABLE)
|
||||
System.out.println("连接目标地址失败!");
|
||||
if(debug)
|
||||
e.printStackTrace();
|
||||
|
||||
}finally {
|
||||
monitor.setState(MonitorData.DOWN);
|
||||
status.setState(LinkStatus.DOWN);
|
||||
if(link!=null) {
|
||||
try {
|
||||
link.close();
|
||||
@@ -426,6 +327,7 @@ public class Kperf implements Runnable{
|
||||
}
|
||||
}
|
||||
tc.interrupt();
|
||||
tcc.interrupt();
|
||||
}
|
||||
}
|
||||
private void updateUsedTime() {
|
||||
@@ -485,7 +387,7 @@ public class Kperf implements Runnable{
|
||||
|
||||
public void close() {
|
||||
closed = true;
|
||||
monitor.setState(MonitorData.DOWN);
|
||||
status.setState(LinkStatus.DOWN);
|
||||
try {
|
||||
if (link != null)
|
||||
link.close();
|
||||
@@ -503,7 +405,7 @@ public class Kperf implements Runnable{
|
||||
|
||||
private void sendIPacket(KLALBPacket blk) {
|
||||
IsendDequeList.add(blk);
|
||||
LockSupport.unpark(tlock);
|
||||
tlock.unpark();
|
||||
}
|
||||
|
||||
private KLALBPacket readPacketFromKPL() throws IOException {
|
||||
@@ -513,20 +415,19 @@ public class Kperf implements Runnable{
|
||||
System.out.println("RX:" + packet);
|
||||
}
|
||||
if (packet != null) {
|
||||
packet.putTimePassport("received");
|
||||
long length=packet.getTotalLength();
|
||||
monitor.getDownloadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), (int)length);
|
||||
//monitor.getDownloadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), (int)length);
|
||||
monitor.recordDownloadPacket((int)length);
|
||||
}
|
||||
return packet;
|
||||
}
|
||||
|
||||
private void writePacketToKPL(KLALBPacket packet) throws IOException {
|
||||
long length=packet.getTotalLength();
|
||||
monitor.getUploadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), (int)length);
|
||||
//monitor.getUploadBandwidth().recordPacket(KLALBUtils.createGlobalUUID(), (int)length);
|
||||
monitor.recordUploadPacket((int) length);
|
||||
link.writeKLALBPacket(packet);
|
||||
link.flush();
|
||||
packet.putTimePassport("sended");
|
||||
packet.printPassport();
|
||||
|
||||
if (showpacket) {
|
||||
System.err.println("TX:" + packet);
|
||||
@@ -535,6 +436,8 @@ public class Kperf implements Runnable{
|
||||
|
||||
|
||||
public void startPerfing() {
|
||||
ThreadTool.makeVThreadIfSupport("测速接收线程" ,this).start();
|
||||
monitorUpdater=new MonitorUpdater();
|
||||
ThreadTool.makeVDaemonThread("线路性能采样线程", monitorUpdater).start();
|
||||
ThreadTool.makeVDaemonThreadIfSupport("测速接收线程" ,this).start();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user