Articles of 延迟

低延迟的Web服务器/负载均衡器为世界的非Twitters

Apache httpd在过去几年中做得很好,在我一直维护的传统自定义LAMP堆栈应用程序中坚如磐石,性能卓越(阅读:试图逃避) 现在,我的LAMP堆栈天数已经编号,正在走向多彩的奇妙世界: 1) Scala REST framework on Jetty 8 (on the fence between Spray & Scalatra) 2) Load balancer/Static file server: Apache Httpd, Nginx, or ? 3) MySQL via ScalaQuery 4) Client-side: jQuery, Backbone, 320 & up or Twitter Bootstrap 选项2是这个问题的重点。 我所看到的基准testing表明,Nginx,Lighthttpd,G-WAN(特别是)和朋友们在性能方面吹袭了Apache,但是这种消失似乎在Web服务器处理多个同时连接的高负载情况下。 鉴于我们的服务器每个月最高带宽为100GB,平均负载在0.10左右,高负载情况显然不起作用。 基本上我需要连接到应用程序服务器(Jetty)和Web服务器的静态文件传输,既可靠又快速。 最后,Web服务器应该作为应用程序服务器的负载平衡器(SSL不需要,服务器驻留在ASA之后)兼任。 我不确定Apache Httpd与替代scheme相比有多快,但是经过testing的软件是经过validation的。 所以,如果我使用Nginx或其他Apache替代品,那么在可见性方面会有什么不同吗? 我不假设,但为了实现近乎即时的页面加载,把问题放在那里;-)

为什么在Nginx的access.log中,request_time比upstream_response_time大得多?

我正在尝试改进一个Web应用程序的性能。 分析应用程序本身,我发现它的响应时间是完全可以接受的(100ms-200ms),但是当我使用ApacheBenchtesting应用程序时,响应时间有时会超过1秒。 当我仔细查看日志时,偶然发现request_time和upstream_response_time之间的差异很大: "GET /wsq/p/12 HTTP/1.0" 200 114081 "-" "ApacheBench/2.3" 0.940 0.286 "GET /wsq/p/31 HTTP/1.0" 200 114081 "-" "ApacheBench/2.3" 0.200 0.086 upstream_response_time与我在web应用程序中的分析非常接近,但对于第一个请求, request_time接近1秒。 什么可能导致这种差异? 我明白request_time是从收到的第一个字节到最后一个响应字节发出的,它会受到networking条件和客户端问题的影响。 我想知道我该如何尽可能地减less平均request_time ?

Linuxmultithreading,在同一进程中继续运行其他线程的同时暂停一个线程

我无法find适当的解决scheme来解决我的问题。 如果我在一个进程中有多个线程。 我想在同一个进程中运行其他线程时,只有一个线程进入hibernate状态,是否有任何预定义的语法,或者是否需要执行自己的实现(睡眠)? 理想情况下,我想从一个线程发送指示到另一个线程,当它是睡觉的时间。 编辑(2015-08-24)我有两个主线程,一个是通过networking发送数据,另一个是从networking接收数据。 除了抖动之外,接收线程还会进行validation和validation以及某些文件pipe理,这些文件pipe理会及时导致它拖到后面。 我喜欢做的是给发送者添加一个微睡眠的东西,这样接收者就可以赶上。 在这种情况下,sched_yield()将不起作用,因为硬件有一个多核CPU,核心数超过40个。

Linux组播中排队/缓冲延迟的位置在哪里?

我们大量使用局域网上许多Linux服务器的多播消息。 我们看到很多延误。 我们基本上发送了大量的小包裹。 我们更关心延迟而不是吞吐量。 这些机器都是现代化的多核心(至less4个,如果算上超线程,一般是8个,16个),总是负载为2.0或更低,通常负载低于1.0。 networking硬件容量也低于50%。 我们看到的延迟看起来像排队延迟:数据包将很快开始增加延迟,直到看起来像堵塞,然后恢复正常。 消息结构基本上是这样的:在“发送线程”中,从队列中拉取消息,添加时间戳(使用gettimeofday() ),然后调用send() 。 接收程序接收消息,给接收时间加上时间戳,并将其推入队列中。 在一个单独的线程中,处理队列,分析发送和接收时间戳之间的差异。 (请注意,我们的内部队列不是问题的一部分,因为时间戳添加在内部排队之外。) 我们不知道从哪里开始寻找这个问题的答案。 我们不熟悉Linux内部。 我们怀疑内核是在发送端还是在接收端(或两者)排队或缓冲数据包。 但是我们不知道如何跟踪这个并追踪它。 值得一提的是,我们使用的是CentOS 4.x(RHEL kernel 2.6.9)。

Linuxnetworking应用的高延迟

我正在玩linuxnetworking编程,我写了一个小客户端服务器应用程序,在客户端和服务器进程之间popup一个小的消息,并测量往返时间。 一致的,我看到大约80ms的本地主机往返(这是连接设置后)。 这似乎非常高。 运行相同代码的同一台机器在Vista上的时钟将大大低于1ms。 任何想法,这种差异可能来自哪里? 代码非常简单,一端接受,另一端连接,然后通过对等套接字发送/接收。 我只是在Linux上开始,如果这是一个愚蠢的问题,道歉。

Ping间隔为什么会影响RTT值?

在ping中,“-i”是发送连续数据包之间的等待间隔(秒)。 我有2台服务器(Host1,2),并将10G网卡插入每台服务器。 我尝试从Host1 ping Host2。 $ sudo ping 10.0.0.2 -c 100 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.191 ms … 64 bytes from 10.0.0.2: icmp_seq=100 ttl=64 time=0.141 ms — 10.0.0.2 ping statistics — 100 packets transmitted, 100 received, 0% packet loss, time 89999ms rtt min/avg/max/mdev = 0.116/0.169/0.231/0.039 ms […]

Linux多播sendto()性能随本地监听器而降低

我们有一个使用组播发送数据的“发布者”应用程序。 该应用程序对性能非常敏感(我们正在微秒级别进行优化)。 侦听此发布数据的应用程序可以(通常是)与发布应用程序在同一台机器上。 我们最近注意到一个有趣的现象:执行sendto()的时间与机器上的听众数量成比例地增加。 例如,假设没有监听者,sendto()调用的基准时间是5微秒。 每个额外的侦听器都会将sendto()调用的时间增加大约2微秒。 所以如果我们有10个监听器,那么sendto()调用需要2 * 10 + 5 = 25微秒。 这对我来说build议sendto()调用阻塞,直到数据被复制到每个单独的监听器。 聆听方面的分析也支持这一点。 如果有10个监听者,每个监听者接收比前一个微秒晚的数据。 (也就是说,第一个监听者在大约5微秒内获取数据,最后一个监听者在大约23-25微秒内获取数据)。 有没有办法在程序层面或系统层面改变这种行为? 就像一个非阻塞/asynchronoussendto()调用? 或者至less阻塞,直到消息被复制到内核的内存,所以它可以返回而无需等待所有的侦听器)?

在Linux上使用共享内存的低延迟数据包处理?

如果我在Linux上接收UDP数据包(我不介意更改一些源代码),那么我的应用程序读取数据包的最快方式是什么? 我是否需要修改networking堆栈,以便一旦接收到UDP数据包,就将其写入共享内存,并让应用程序访问该内存? 是否有任何方式让堆栈通知应用程序做出反应,而不是让应用程序不断轮询共享内存? 任何意见/进一步的资源,欢迎,我只看到: http://www.kegel.com/c10k.html

在Linux上的HTTP POST调用中模拟延迟

用例 我正在开发一个企业级支付应用程序(用JAVA编写)。 我正在模拟对银行进行的HTTP POST调用的延迟。 这将允许我模拟可能发生的不同的延迟/不可用情况。 代码 以下代码将请求发送给银行: try { // Set the location of the Bank Of America payment gateway URL url = new URL(getParameterGatewayUrl()); // Open the connection urlConnection = url.openConnection(); // Set the connection timeout urlConnection.setConnectTimeout(getTimeoutSeconds() * 1000); // Set the DoOutput flag to true because we intend // to use the URL […]

Oracle 11.2在随机时间对简单的SQL有2秒的延迟

简单的表连接通常在0.0XX秒内完成,有时在2.0XX秒内完成(根据PL / SQL Developer SQL执行)。 它从SQL Plus运行时发生。 如果我运行SQL 10次,8次运行正常,2次在2+秒。 这是在Centos 7上安装Oracle 11.2.0.4 for Linux x86_64。我已经安装了Oracle推荐的补丁: 补丁19769489 – 数据库补丁集更新11.2.0.4.5(包括CPUJan2015) 补丁19877440 – Oracle JavaVM组件11.2.0.4.2数据库PSU(Jan2015) 修补后没有变化。 2表有:LNK_PACK_REP:13行包:6行 在SQL Plus中,我启用了所有的统计信息,并多次运行SQL。 只有时间从0.1变到2.1。 如果我将0.1秒运行与2.1秒运行进行比较,则没有其他统计信息发生变化。 该服务器有16 Gb RAM和8个CPU核心。 服务器负载在0.1以下(暂时没有用户使用服务器)。 输出: SQL>从LNK_PACK_REP中selectPACKAGE_ID,ID,package_name LNKPR INNER JOIN PACKAGES P ON LNKPR.PACKAGE_ID = P.ID; PACKAGE_ID ID PACKAGE_NAME 3 3 RAPOARTE 3 3 RAPOARTE 121 121 VANZARI […]