小编Mat*_*att的帖子

Linux UDP数据包丢失的原因

我有一个Linux C++应用程序,它接收有序的UDP数据包.由于排序,我可以很容易地确定数据包丢失或重新排序的时间,即遇到"间隙"时.该系统具有处理间隙的恢复机制,但是,最好首先避免间隙.使用一个简单的基于libpcap的数据包嗅探器,我已经确定硬件级别的数据没有间隙.但是,我发现我的应用程序存在很多差距.这表明内核正在丢弃数据包; 通过查看/ proc/net/snmp文件来确认.当我的应用程序遇到间隙时,Udp InErrors计数器会增加.

在系统级别,我们增加了最大接收缓冲区:

# sysctl net.core.rmem_max
net.core.rmem_max = 33554432
Run Code Online (Sandbox Code Playgroud)

在应用程序级别,我们增加了接收缓冲区大小:

int sockbufsize = 33554432
int ret = setsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF,
        (char *)&sockbufsize,  (int)sizeof(sockbufsize));
// check return code
sockbufsize = 0;
ret = getsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF, 
        (char*)&sockbufsize, &size);
// print sockbufsize
Run Code Online (Sandbox Code Playgroud)

在调用getsockopt()之后,打印值总是它设置的2倍(上例中的67108864),但我相信这是可以预期的.

我知道无法快速消耗数据会导致数据包丢失.但是,所有这个应用程序都检查顺序,然后将数据推入队列; 实际处理在另一个线程中完成.此外,该机器是现代的(双Xeon X5560,8 GB RAM)和非常轻载.我们确实有几十个相同的应用程序以更高的速率接收数据,但没有遇到这个问题.

除了消耗太慢的应用程序之外,还有其他原因导致Linux内核可能丢弃UDP数据包吗?

FWIW,这是在CentOS 4上,内核为2.6.9-89.0.25.ELlargesmp.

c c++ linux networking udp

13
推荐指数
2
解决办法
1万
查看次数

Python正则表达式不匹配

这是我确定我遗漏了一些简单的事情之一,但是......在下面的示例程序中,我正在尝试使用Python的RE库来解析字符串"line"以获得浮点数在百分号之前的数字,即"90.31".但代码总是打印"不匹配".

我也试过了几个其他的正则表达式,都有相同的结果.我错过了什么?

#!/usr/bin/python
import re
line = '    0 repaired, 90.31% done'
pct_re = re.compile(' (\d+\.\d+)% done$')
#pct_re = re.compile(', (.+)% done$')
#pct_re = re.compile(' (\d+.*)% done$')
match = pct_re.match(line)
if match: print 'got match, pct=' + match.group(1)
else: print 'no match'
Run Code Online (Sandbox Code Playgroud)

python regex

9
推荐指数
2
解决办法
1万
查看次数

Linux多线程系统上的线程调度差异?

我们有几个对延迟敏感的"管道"式程序,当在一个Linux内核上运行时,它们具有可测量的性能降级.特别是,我们看到2.6.9 CentOS 4.x(RHEL4)内核的性能更好,而CentOS 5.x(RHEL5)的2.6.18内核性能更差.

通过"管道"程序,我的意思是具有多个线程的程序.多线程处理共享数据.在每个线程之间,有一个队列.所以线程A获取数据,推入Qab,线程B从Qab拉出,做一些处理,然后推入Qbc,线程C从Qbc拉出等.初始数据来自网络(由第三方生成).

我们基本上测量从接收数据到最后一个线程执行任务的时间.在我们的应用程序中,当从CentOS 4移动到CentOS 5时,我们看到增加了20到50微秒.

我使用了一些分析我们的应用程序的方法,并确定CentOS 5上增加的延迟来自队列操作(特别是弹出).

但是,我可以通过使用taskset将程序绑定到可用内核的子集来提高CentOS 5的性能(与CentOS 4相同).

所以在我看来,在CentOS 4和5之间,有一些变化(可能是内核)导致线程的调度方式不同(这种差异对于我们的应用来说并不是最理想的).

虽然我可以使用taskset(或通过sched_setaffinity()代码)解决这个问题,但我的首选是不必这样做.我希望有一些内核可调参数(或者可能的可调参数集合),其默认值在不同版本之间进行了更改.

有人对此有经验吗?或许还有一些需要调查的领域?

更新:在此特定情况下,问题已通过服务器供应商(Dell)的BIOS更新解决.我把头发拉了一下这个.直到我回到基础,并检查我的供应商的BIOS更新.可疑的是,其中一个更新表示"在最高性能模式下提高性能".一旦我升级了BIOS,CentOS 5就更快了 - 一般来说,但特别是在我的队列测试和实际生产运行中.

linux multithreading latency scheduling rhel

6
推荐指数
1
解决办法
2628
查看次数

确定乘积和多项式中最佳权重的快速算法?

我正在寻找一种比在这样的问题中找到最佳系数(又称权重)的快于强力的算法:

样本定义为一系列N个数字.在这种情况下,比如说N = 10.样本数M非常大,比如M = 1000000.这基本上是M行XN列的矩阵.所以这些样本的集合如下所示:

S_0_0  S_0_1 S_0_2 ... S_0_N
S_1_0  S_1_1 S_1_2 ... S_1_N
...
S_M_0  S_M_1 S_M_2 ... S_M_N
Run Code Online (Sandbox Code Playgroud)

此外,还有一系列相应的N个权重.权重系列P的数量也很大,比如P = 2000000.这是P行XN列的另一个矩阵.它看起来类似于样本集:

W_0_0  W_0_1 S_0_2 ... W_0_N
W_1_0  W_1_1 S_1_2 ... W_1_N
...
W_P_0  W_P_1 S_P_2 ... W_P_N
Run Code Online (Sandbox Code Playgroud)

我试图找到一系列权重(即权重集中的右行),它最大化了以下总和(即行x):

W_x_0 * S_0_0  +  W_x_1 * S_0_1  + ... +  W_x_N * S_0_N +
W_x_0 * S_1_0  +  W_x_1 * S_1_1  + ... +  W_x_N * S_1_N + …
Run Code Online (Sandbox Code Playgroud)

algorithm math mathematical-optimization polynomials

2
推荐指数
1
解决办法
91
查看次数