协同遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟

在这篇文章中,我演示了许多想法和技术:

  1. 如何编写一个简单的非阻塞NIO客户端/服务器
  2. 协调遗漏的影响
  3. 如何测量百分位数的延迟(相对于简单平均)
  4. 如何在计算机上计时延迟回送

我最近正在为客户端服务器应用程序开发低延迟基准测试。 最初,我在使用环回TCP的单台计算机上模拟基准测试。 我要量化的第一个指标是允许简单的环回延迟需要多少记录延迟。 这样,我便可以更清楚地了解实际应用程序增加的延迟。

为此,我创建了一个程序(文章末尾的代码),该程序将一个字节从客户端传输到服务器,然后再传输回来。 重复执行此操作并处理结果。

该程序是使用非阻塞Java NIO编写的,以尽可能优化回送延迟。

比记录平均时间更重要的是,记录了百分比延迟。 (有关如何测量延迟的讨论,请参见此处的上一篇文章)。 至关重要的是,协调遗漏的代码因素。 (要了解更多关于此看到这里从吉尔·特内)。 简而言之,您不会从开始时就开始计时,而应该从开始就开始。

这些是我2岁的MBP的结果。

Starting latency test rate: 80000
Average time 2513852
Loop back echo latency was 2514247.3/3887258.6 4,196,487/4,226,913 4,229,987/4230294 4,230,294 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 70000
Average time 2327041
Loop back echo latency was 2339701.6/3666542.5 3,957,860/3,986,626 3,989,404/3989763 3,989,763 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 50000
Average time 1883303
Loop back echo latency was 1881621.0/2960104.0 3,203,771/3,229,260 3,231,809/3232046 3,232,046 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 30000
Average time 1021576
Loop back echo latency was 1029566.5/1599881.0 1,726,326/1,739,626 1,741,098/1741233 1,741,233 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 20000
Average time 304
Loop back echo latency was 65.6/831.2 3,632/4,559 4,690/4698 4,698 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 10000
Average time 50
Loop back echo latency was 47.8/57.9 89/120 152/182 182 us for 50/90 99/99.9 99.99/99.999 worst %tile

将这些结果与我没有纠正遗漏的情况进行比较:

Starting latency test rate: 80000
Average time 45
Loop back echo latency was 44.1/48.8 71/105 124/374 374 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 70000
Average time 45
Loop back echo latency was 44.1/48.9 76/106 145/358 358 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 50000
Average time 45
Loop back echo latency was 43.9/48.8 74/105 123/162 162 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 30000
Average time 45
Loop back echo latency was 44.0/48.8 73/104 129/147 147 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 20000
Average time 45
Loop back echo latency was 44.7/49.6 78/107 135/311 311 us for 50/90 99/99.9 99.99/99.999 worst %tile
Starting latency test rate: 10000
Average time 46
Loop back echo latency was 45.1/50.8 81/112 144/184 184 us for 50/90 99/99.9 99.99/99.999 worst %tile

如您所见,吞吐量的影响被完全忽略了! 看起来,即使以每秒80,000条消息的速度运行,您的99.99个百分位数仍为374us,而实际上却远大于此。

实际上,只有在吞吐量接近每秒10,000时,您才能达到目标延迟。 如您所直观地理解的那样,在吞吐量和延迟之间需要权衡取舍。

该测试的代码如下:

package util;import java.io.EOFException;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Arrays;/*** Created by daniel on 02/07/2015.* Simple program to test loopback speeds and latencies.*/
public class LoopBackPingPong {public final static int PORT = 8007;public void runServer(int port) throws IOException {ServerSocketChannel ssc = ServerSocketChannel.open();ssc.bind(new InetSocketAddress(port));System.out.println("listening on " + ssc);final SocketChannel socket = ssc.accept();socket.socket().setTcpNoDelay(true);socket.configureBlocking(false);new Thread(() -> {long totalTime = 0;int count = 0;try {System.out.println("Connected " + socket);ByteBuffer bb = ByteBuffer.allocateDirect(1);int length;while ((length = socket.read(bb)) >= 0) {if (length > 0) {long time = System.nanoTime();bb.flip();bb.position(0);count++;if (socket.write(bb) < 0)throw new EOFException();bb.clear();totalTime += System.nanoTime() - time;}}} catch (IOException ignored) {} finally {System.out.println("Total server time " + (totalTime / count) / 1000);System.out.println("... disconnected " + socket);try {socket.close();} catch (IOException ignored) {}}}).start();}public void testLatency(int targetThroughput, SocketChannel socket) throws IOException {System.out.println("Starting latency test rate: " + targetThroughput);int tests = Math.min(18 * targetThroughput, 100_000);long[] times = new long[tests];int count = 0;long now = System.nanoTime();long rate = (long) (1e9 / targetThroughput);ByteBuffer bb = ByteBuffer.allocateDirect(4);bb.putInt(0, 0x12345678);for (int i = -20000; i < tests; i++) {//now += rate;//while (System.nanoTime() < now)//    ;now = System.nanoTime();bb.position(0);while (bb.remaining() > 0)if (socket.write(bb) < 0)throw new EOFException();bb.position(0);while (bb.remaining() > 0)if (socket.read(bb) < 0)throw new EOFException();if (bb.getInt(0) != 0x12345678)throw new AssertionError("read error");if (i >= 0)times[count++] = System.nanoTime() - now;}System.out.println("Average time " + (Arrays.stream(times).sum() / times.length) / 1000);Arrays.sort(times);System.out.printf("Loop back echo latency was %.1f/%.1f %,d/%,d %,d/%d %,d us for 50/90 99/99.9 99.99/99.999 worst %%tile%n",times[times.length / 2] / 1e3,times[times.length * 9 / 10] / 1e3,times[times.length - times.length / 100] / 1000,times[times.length - times.length / 1000] / 1000,times[times.length - times.length / 10000] / 1000,times[times.length - times.length / 100000] / 1000,times[times.length - 1] / 1000);}public static void main(String... args) throws Exception {int port = args.length < 1 ? PORT : Integer.parseInt(args[0]);LoopBackPingPong lbpp = new LoopBackPingPong();new Thread(() -> {try {lbpp.runServer(port);} catch (IOException e) {Jvm.rethrow(e);}}).start();//give the server a chance to startThread.sleep(1000);SocketChannel socket = SocketChannel.open(new InetSocketAddress("localhost", port));socket.socket().setTcpNoDelay(true);socket.configureBlocking(false);for (int i : new int[]{80_000, 70_000, 50_000, 30_000, 20_000, 10_000})lbpp.testLatency(i, socket);System.exit(0);}}

翻译自: https://www.javacodegeeks.com/2015/07/the-effect-of-co-ordinated-omission-measure-loopback-latency-using-a-simple-nio-clientserver.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 画蜘蛛_如何学习 R 绘图?

写在前面&#xff1a;为啥不用excel绘制这些图&#xff0c;用PoweBI&#xff0c;帆软BI等可视化软件来绘图&#xff0c;不是更方便吗&#xff1f;的确&#xff0c;这些工具都很方便&#xff0c;但同时&#xff0c;它们显得很呆&#xff0c;不够灵活&#xff0c;更为致命的是&am…

conflicting types for ‘方法名’ 的错误

将main()的实现写在drawShapes(),drawCircle(),drawRectangle()...之前. 结果编译的时候出现了 conflicting types for "方法名"的错误。故到网上查找答案&#xff0c;发现在这里需要严格按照函数出现的先后顺序才能成功编译&#xff0c;也就是main()要定义在最后&a…

Oracle用户system解锁

1.首先进入sql plus窗口&#xff08;参见上一篇文章&#xff09; 2.进入后&#xff1a;输入select username,account_status from dba_users where usernameSYSTEM; 3.查询system用户的状态和用户名&#xff0c;这里能查询出密码&#xff0c;但是查出来的密码是密文&#xff0c…

captcha库_将CAPTCHA添加到您的GWT应用程序

captcha库什么是验证码&#xff1f; 在一个充满恶意机器人的世界中&#xff0c;您应该怎么做才能保护您宝贵的Web应用程序&#xff1f; 您真正应该做的基本事情之一就是向其中添加CAPTCHA功能。 如果您不熟悉&#xff08;听起来有些奇怪&#xff09;&#xff0c;则CAPTCHA是确保…

GCD6: 在GCD上异步执行非UI相关任务

讨论&#xff1a;在主队列、串行队列和并发队列上异步执行代码块才能见识到 GCD 的真正实力。 要在分派队列上执行异步任务,你必须使用下面这些函数中的其中一个: dispatch_async为了异步执行向分派队列提交一个 Block Object(2 项都通过参数指定) dispatch_async_f为了异步执行…

带有Java 8,lambda表达式和Mockito-Java8附加组件的更紧凑的Mockito

Mockito-Java8是一组Mockito附加组件&#xff0c;它们利用Java 8和lambda表达式使Mockito的模拟更加紧凑。 在2015年初&#xff0c;我进行了简短的演讲&#xff0c; Java 8为测试带来了力量&#xff01; 我在GeeCON TDD 2015和DevConf.cz 2015上发表了演讲。在我使用4个示例的演…

ContentProvider与ContentResolver使用

例如以下内容为从网络转载&#xff1a;使用ContentProvider共享数据&#xff1a;当应用继承ContentProvider类&#xff0c;并重写该类用于提供数据和存储数据的方法&#xff0c;就能够向其它应用共享其数据。虽然使用其它方法也能够对外共享数据&#xff0c;但数据訪问方式会因…

cshtml中引用css_ASP.NET CoreMVC 中的控制器

Controller in ASP.NET Core MVC在本节中&#xff0c;我们将讨论 Controller 是什么以及它在 ASP.NET Core MVC 中的作用。Fiddler需要大家提前装一个工具&#xff0c;https://www.telerik.com/fiddlerFiddler 是一个 http 协议调试代理工具&#xff0c;它能够记录并检查所有你…

小学阅读方法六种_小学生掌握了这些语文答题方法,轻松应对阅读理解,不再是难事...

家长们都知道&#xff0c;孩子们在学习数学的时候&#xff0c;重要的就是数学的一些公式&#xff0c;只要把数学公式记牢&#xff0c;做很多题的时候灵活运用&#xff0c;就可以解答。今天我们来看看&#xff0c;语文方面也有一些答题公式&#xff0c;当孩子们完全掌握了这些公…

hdu--4028--dp

这个dp我没做出来啊...其实不难..主要题意没理解好 fuck. 给你1-N这N个数 一共2^N-1个子集 每个子集的LCM值>M的情况数有多少种 我也是醉了 这么个题目 给我套他那个题面 硬是没看懂 他在问什么 还是 英语太渣了 然后就是个 状态转移方程的考虑了 map<LL,LL>dp[size]…

敏捷中gwt含义_在您的GWT应用程序中添加JSON功能

敏捷中gwt含义JSON简介 在Web应用程序上工作时&#xff0c;总是会出现客户端-服务器数据交换的问题。 在此问题上有多种方法&#xff0c;其中许多使用XML进行交换。 执行此任务的一种不太知名的格式是JSON。 JSON&#xff08;JavaScript对象表示法&#xff09;是一种轻量级的数…

c++ 经典代码_C语言经典100题(31)

1上期答案揭晓首先给大家看看上一篇文章C语言经典100题(30)中第三部分编程题的答案&#xff1a;#include int main( ){ long ge,shi,qian,wan,x; printf("请输入 5 位数字&#xff1a;"); scanf("%ld",&x); wanx/10000; /*分解出万…

$ 与 # 区别

# 会根据不同类型而生产字符串&#xff0c;如 String 类型 : aa ---> aa,长整型Long:123 ---> 123$ 表示原生类型&#xff0c;如 String 类型 : aa ---> aa,长整型Long:123 ---> 123转载于:https://www.cnblogs.com/svennee/p/4078824.html

JAX-RS 2.x与Spring MVC:返回对象列表的XML表示

JSON是所有REST * API的王者&#xff0c;但是您仍然可能需要公开多种表示形式&#xff0c;包括XML。 使用JAX-RS和Spring MVC都非常简单。 实际上&#xff0c;唯一要做的就是用JAXB注释对从API调用返回的POJO进行注释。 但是&#xff0c;我认为序列化对象列表时&#xff0c;JA…

android读取excel文件_python里读写excel等数据文件的几种常用方式

python处理数据文件第一步是要读取数据&#xff0c;文件类型主要包括文本文件(csv、txt等)、excel文件、数据库文件、api等。下面整理下python有哪些方式可以读取数据文件。1. python内置方法(read、readline、readlines)read() &#xff1a; 一次性读取整个文件内容。推荐使用…

UGUI学习笔记之渲染顺序

转载请注明地址&#xff1a;http://www.cnblogs.com/Vincentblogs/p/4083028.html QQ群&#xff1a;346738352 Unity技术交流群&#xff0c;讲纯粹的技术。 数据记录为Unity4.6b21版本 图片解释&#xff1a;这是一个按钮UI,层级1显示的是按钮背景&#xff0c;层级2显示的Image…

exp导出excel oracle_如何从Oracle快速导出数据到Excel

【摘要】在生产系统使用过程中&#xff0c;常常会有从数据库中导出数据的需求。支持多种导出方式&#xff0c;例如使用spool、utl_file等内置方法导出&#xff0c;利用plsql developer、等第三方工具等。【正文】Oracle支持多种导出方式&#xff0c;包括自带的工具包和第三方工…

C#找出数组中重复次数最多的数值

给定一个int数组&#xff0c;里面存在重复的数值&#xff0c;如何找到重复次数最多的数值呢? 这是在某社区上有人提出的问题&#xff0c;我想到的解决方法是分组。 1、先对数组中的所有元素进行分组&#xff0c;那么&#xff0c;重复的数值肯定会被放到一组中&#xff1b; 2、…

什么比日期和时区更难? SQL / JDBC中的日期和时区!

在jOOQ邮件列表上&#xff0c;最近有一个有趣的讨论&#xff0c;关于jOOQ当前缺乏对TIMESTAMP WITH TIME ZONE数据类型的现成支持。 没有人说日期&#xff0c;时间和时区很容易&#xff01; 这里有一个有趣的部分&#xff0c;我建议阅读&#xff1a; 虚假的程序员相信时间 当…

Javascript – 正则表达式

目录 1. 正则表达式1.1 创建1.2 RegExp 对象属性1.3 RegExp 对象方法1.4 RegExp 分组2. 元字符和正则表达式规则1正则表达式 正则表达式本身就是一种语言&#xff0c;由普通字符和特殊的元字符&#xff08;metacharacters&#xff09;组成。它描述了字符串的匹配模式&#xff0…