服务器 Gind.cn

服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器

TCP ack暂停,然后恢复,然后再次暂停。 为什么?

我想在我的应用程序中寻找降低数据传输速率的原因。 我有12个embedded式系统和一个Linux服务器。 embedded式系统通过交换机在以太网链路上通过TCP发送数据到服务器。 以下是Wireshark捕获一个板卡上的stream量的TCP StreamGraph。 正如你所看到的,数据传输发生在大约5.8MBit / s直到大约0.25秒。 这与我所预期的embedded式系统一样快。 在此之后,延期被插入转移。 以下显示了该图的一个特写: 标有ACK的底部的阶梯形曲线显示服务器在任何给定时间已经确认了多less数据。 标有RWIN的相应曲线显示了数据卡上的缓冲区有多less空间。 标记为“发送数据”的较小垂直段是实际发送的数据包。 在A点,服务器以尽可能快的速度发送数据,但是持续23ms,服务器不会发送数据。 允许embedded式系统在不等待ACK的情况下发送RWIN,但是它不这样做,因为它需要保持发送的数据,直到它们被发送(如果需要重新发送),发送缓冲区空间是有限。 然后,在B点,所有接收到的数据立即被确认,正常的确认和发送恢复2.5ms,然后再发生一次暂停。 Wireshark捕获是由一台不同的PC机完成的,该PC连接到交换机上的一个端口,该端口被设置为镜像在embedded式系统所连接的端口上发送和接收的所有数据。 Linux服务器运行一个Java应用程序来处理数据并将它们存储在磁盘上。 它没有显示已经超出了CPU的迹象。 操作系统是具有默认networking设置的Ubuntu Server 12.04。 我可以看到,我可能会从在embedded式系统中分配更多的发送缓冲区空间中获益,以匹配Linux服务器中的接收窗口空间量,但这似乎并不是限制因素。 我的问题是: 什么可能是Linux服务器暂停ACK的原因,即使它显然能够收到的一切就好了? 我怎么去debugging呢?

是否有可能使用供应商不可知的API每秒处理数百万个数据报?

我正在调查是否可以在Windows中实现HPC应用程序,使用十几个或多达200个多播组 (即使用MSI-X和RSS I can ),可以高速接收小型UDP多播数据报(大多数为100-400字节)扩展到多个内核),每个数据包进行一些处理,然后将其发送出去。 通过TCP发送,我尽可能地达到了(6.4Gb / sec),而不用打墙,但以高的速率接收数据报就成了一个问题。 在最近一次在Windows 2012 R2上使用2端口10Gb以太网网卡的高规格NUMA机器的testing中 ,我只能每秒接收数十万个UDP数据报 (早期丢弃,即没有实际处理数据)使用2×12核心消除我的应用程序的处理开销,看看它有多快),testing的12个多播组的核心部分似乎分布在一个NUMA节点的8个或10个核心上(设置了最大RSS队列到16) – 尽pipe与.net应用程序,所以本机应用程序应该能够更快。 但是,即使Len Holgate在他的高性能Windows RIOtesting中也只能使用1024字节的UDP有效载荷接收500kpps的UDP数据包 。 在QLogic的白皮书 (未提及的操作系统)中,“multithreading超小型数据包路由”(包括接收和后续发送?)的限制被设置为5.7Mpps 。 在有关Linuxnetworking的 文章中 ,每个内核的限制被设置为1Mpps到2Mpps (据报道,或多或less线性扩展),甚至有15Mpps的特殊解决scheme绕过内核。 例如netmap 可以在10GigE链路上以线速( 14.88Mpps )产生stream量,只需一个以900Mhz运行的内核。 这相当于每个数据包大约60-65个时钟周期,并且随着内核和时钟频率(4个内核,线速率在450 MHz以下)实现了良好的扩展。 在接收方面达到类似的利率 。 那么,我可以通过使用与供应商无关的API来使用标准的以太网(而不是以太网 )来使用Windows 2012 R2和标准的以太网NIC吗?

基于进程的IPstream量到不同的默认路由/接口

我试图确定是否有可能通过特定接口select性地路由来自进程或进程组的IP数据包,而所有其他数据包通过另一个接口进行路由。 也就是说,我希望来自/usr/bin/testapp所有stream量都通过eth1路由,而所有其他数据包都通过eth0 。 这种情况下的报文可以是TCP,UDP,ICMP等,可以由最终用户configuration使用不同的端口。 因为我不能轻易地强制有问题的过程绑定到特定的接口,所以我试图通过路由实现相同的结果。 这可能吗? —编辑— 在这里和其他许多地方通过一个有用的build议是基于UID标记数据包; 这不是真正的目标。 目标是根据进程标记/过滤/路由而不pipe用户 。 也就是说,如果alice , bob和charlie都运行自己的/usr/bin/testapp实例, 所有三个实例的所有数据包应该通过eth1而来自系统的所有其他数据包应该通过eth0 。 请注意,通过源/目标端口,用户名/ UID等标记是不够的,因为各种用户可能运行testapp ,他们可能会在他们自己的~/.config/testapp.conf或其他设置不同的端口。 问题是关于过程的过滤。 一个可用的选项,虽然我不知道它是多么有帮助,但是在本地二进制文件中使用基于/bin/(ba|z)?sh的包装。 —编辑— 我指的是在运行现代Linux内核的系统上进行路由,例如4.0或更高版本。 如果iproute2 , nftables , conntrack和类似工具之外还有软件依赖性,我愿意探索开源解决scheme,尽pipe基本工具是可取的。

内存泄露在Apache上

显然,由于没有被Apache发布的信号量(被configuration为反向代理),我有轻微的内存泄漏。 当平台获得更多的stream量时,随着时间的推移,这个泄漏将变得更加重要。 内存可以在我们发出下面的命令时释放,也可以通过硬重启重启Apache。 平稳重启不释放内存。 /usr/bin/ipcrm sem $(/usr/bin/ipcs -s | grep www-data | awk '{print$2}') 如果我们不强制释放信号量,我们会遇到类似于下面的post中描述的问题。 什么是信号灯,它们是如何造成的? Apache然后拒绝重新启动,我们没有得到日志中的错误消息。 我们已经做了几个testing,但没有成功解决这个问题。 我们用kernel.sem值更改了sysctl.conf文件 当前值是: $ cat /proc/sys/kernel/sem 500 64000 64 256 我一个接一个的closures了下面的模块(并相应的改变了Apacheconfiguration文件): LoadModule security2_module /usr/lib/apache2/modules/mod_security2.so LoadModule geoip_module /usr/lib/apache2/modules/mod_geoip.so LoadModule pagespeed_module /usr/lib/apache2/modules/mod_pagespeed_ap24.so LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so LoadModule proxy_protocol_module /usr/lib/apache2/modules/mod_proxy_protocol.so 然后,我试图从mpm_event移动到mpm_worker,也没有太大的成功。 Apache和模块的当前版本是: $ apache2 -V Server version: Apache/2.4.7 (Ubuntu) Server built: Mar […]