This commit is contained in:
2026-07-07 00:22:32 +08:00
parent 620afef715
commit 74e4360d71
89 changed files with 1986 additions and 3374 deletions
+74 -169
View File
@@ -1,39 +1,25 @@
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.LinkStatus;
import org.kne.cloud.network.monitor.MonitorData;
import org.kne.cloud.network.monitor.SpeedAndTrafficAndDelayMonitorDataImpl;
import com.github.f4b6a3.uuid.UuidCreator;
import org.kne.concurrent.ThreadParker;
import org.kne.concurrent.ThreadYieldCheckpoint;
public class Kperf implements Runnable{
@@ -52,11 +38,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 +78,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 +86,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 +134,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 +152,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 +196,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 +205,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 +226,10 @@ public class Kperf implements Runnable{
}else {
LockSupport.parkNanos(1000000);
tlock.parkNanos(1000000);
}
}
}
Thread.yield();
}
} catch (IOException | UnresolvedAddressException e) {
if (debug)
@@ -334,19 +253,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 +303,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 +329,7 @@ public class Kperf implements Runnable{
}
}
tc.interrupt();
tcc.interrupt();
}
}
private void updateUsedTime() {
@@ -485,7 +389,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 +407,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 +417,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 +438,8 @@ public class Kperf implements Runnable{
public void startPerfing() {
ThreadTool.makeVThreadIfSupport("测速接收线程" ,this).start();
monitorUpdater=new MonitorUpdater();
ThreadTool.makeVDaemonThread("线路性能采样线程", monitorUpdater).start();
ThreadTool.makeVDaemonThreadIfSupport("测速接收线程" ,this).start();
}
}
@@ -13,7 +13,7 @@ import org.kne.cloud.network.MultipurposeSocketAddress;
import org.kne.cloud.network.SocketChannelListener;
import org.kne.cloud.network.ThreadTool;
import org.kne.cloud.network.klalb.KLALBController;
import org.kne.cloud.network.klalb.KLALBRemoteLine;
import org.kne.cloud.network.klalb.KLALBRemoteLink;
import org.kne.cloud.network.klalb.StreamChannelKLALBPacketLink;
public class NodeBenchmark implements Runnable{
@@ -49,7 +49,7 @@ for (int i = 0; i < nodes; i++) {
SocketChannelListener scl=new SocketChannelListener(ServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.8",0)));
scl.setCon((c)->{
try {
kct.addRemoteLine(new KLALBRemoteLine(klalbController,new StreamChannelKLALBPacketLink(c)));
kct.addRemoteLine(new KLALBRemoteLink(klalbController,new StreamChannelKLALBPacketLink(c)));
} catch (IOException e) {
e.printStackTrace();
}