本文介绍了AF_UNIX套接字的开销?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我看到一对夫妇奇怪的东西有一对被调用创建AF_UNIX套接字如:
socketpair(AF_UNIX,SOCK_STREAM,0,SFD);
在哪里SFD是一个int [2]数组的文件描述符。
首先,默认缓冲区大小似乎正好122K(124928字节),而不是任何东西从/ proc / SYS /网(如被设置为128K wmem_default)。有谁知道这个奇怪的缓冲区大小的原因是什么?
二,通过插座(8字节)编写小消息时。我只能写块,这是只有8 * 423 = 3384字节,另一个奇怪的大小之前写他们的423。这些消息作为虽然他们正在采取的每个295 +一点点字节。这是什么开销的来源?
运行在RHEL6(2.6.32,64位)
我写了一个程序来尝试不同的数据大小,以比较间接成本:
的#include<&errno.h中GT;
#包括LT&;&stdio.h中GT;
#包括LT&;&stdint.h GT;
#包括LT&;&stdlib.h中GT;
#包括LT&;&unistd.h中GT;
#包括LT&; SYS / types.h中>
#包括LT&; SYS / socket.h中>
#包括LT&; netinet / in.h中>#定义DATA_SIZE 4无效的run(为size_t大小){
INT SFD [2];
如果(socketpair(AF_UNIX,SOCK_STREAM,0,SFD)== -1){
PERROR(错误);
}
INT sndbuf,SBSIZE = sizeof的(sndbuf);
的getsockopt(SFD [0],SOL_SOCKET,SO_SNDBUF,&放大器; sndbuf,(socklen_t的*)及SBSIZE); 的printf(数据大小:ZD%\\ n,大小);
字符的buff【规格】;
为size_t写道= 0;
为(为size_t二= 0; II蛋白酶32768;ⅱ++){
如果((发送(SFD [0],浅黄色,大小,MSG_DONTWAIT)== -1)及及(错误号== EAGAIN)){
写=二;
打破;
}
} 的printf(中写道:ZD%\\ n,写); 如果(写!= 0){
INT BPM = sndbuf /写;
诠释哦= BPM - 大小; 的printf(字节/消息:%I \\ N,BPM);
的printf(开销:%I \\ N,哦);
的printf(\\ n);
} 关闭(SFD [0]);关闭(SFD [1]);
}诠释主(){
INT SFD [2];
socketpair(AF_UNIX,SOCK_STREAM,0,SFD); INT sndbuf,SBSIZE = sizeof的(sndbuf);
的getsockopt(SFD [0],SOL_SOCKET,SO_SNDBUF,&放大器; sndbuf,(socklen_t的*)及SBSIZE); 的printf(缓冲大小:%我的\\ n \\ n,sndbuf);
关闭(SFD [0]);关闭(SFD [1]); 为(为size_t二= 4;ⅱ&下; = 4096;ⅱ* = 2){
运行(二);
}
}
这给出了:
缓冲区大小:124928数据大小:4
写道:423
字节/消息:295
开销:291数据大小:8
写道:423
字节/消息:295
开销:287数据大小:16
写道:423
字节/消息:295
开销:279数据大小:32
写道:423
字节/消息:295
开销:263数据大小:64
写道:423
字节/消息:295
开销:231数据大小:128
写道:348
字节/消息:358
开销:230数据大小:256
写道:256
字节/消息:488
开销:232数据大小:512
写道:168
字节/消息:743
开销:231数据大小:1024
写道:100
字节/消息:1249
开销:225数据大小:2048
写道:55
字节/消息:2271
开销:223数据大小:4096
写道:29
字节/消息:4307
开销:211
与使用管道肯定有很多的开销:
数据大小:4
写道:16384
字节/消息:4
开销:0数据大小:8
写道:8192
字节/消息:8
开销:0数据大小:16
写道:4096
字节/消息:16
开销:0数据大小:32
写道:2048
字节/消息:32
开销:0数据大小:64
写道:1024
字节/消息:64
开销:0数据大小:128
写道:512
字节/消息:128
开销:0数据大小:256
写道:256
字节/消息:256
开销:0数据大小:512
写道:128
字节/消息:512
开销:0数据大小:1024
写道:64
字节/消息:1024
开销:0数据大小:2048
写道:32
字节/消息:2048
开销:0数据大小:4096
写道:16
字节/消息:4096
开销:0
解决方案
看一看插座(7)手册页。还有,上面写着一个部分:
So it appears that the overhead is simply to hold bookkeeping information for the Kernel.
这篇关于AF_UNIX套接字的开销?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!