AF_UNIX socket开销?
我看到一些奇怪的东西,一对AF_UNIX插座创建的呼叫,如:
socketpair(AF_UNIX,SOCK_STREAM,sfd); 其中sfd是文件描述符的int [2]数组。 首先,默认缓冲区大小似乎是122K(124928字节),而不是/ proc / sys / net(如wmem_default,设置为128K)的任何东西。有没有人知道这个奇怪的缓冲区大小的原因? 第二,当通过套接字写入小消息(8字节)时。我只能在写入块之前写入其中的423个,这只有8 * 423 = 3384字节,另一个奇数的大小。这些消息的作用就好像它们每个占用了一点点字节一样。这个开销的来源是什么? 在RHEL6上运行(2.6.32,64位) 我写了一个程序来尝试不同大小的数据来比较间接成本: #include <errno.h> #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define DATA_SIZE 4 void run(size_t size) { int sfd[2]; if (socketpair(AF_UNIX,sfd) == -1) { perror("error"); } int sndbuf,sbsize = sizeof(sndbuf); getsockopt(sfd[0],SOL_SOCKET,SO_SNDBUF,&sndbuf,(socklen_t*)&sbsize); printf("Data Size: %zdn",size); char buff[size]; size_t wrote=0; for (size_t ii=0; ii < 32768; ii++) { if ((send(sfd[0],buff,size,MSG_DONTWAIT) == -1) && (errno == EAGAIN)) { wrote = ii; break; } } printf("Wrote: %zdn",wrote); if (wrote != 0) { int bpm = sndbuf/wrote; int oh = bpm - size; printf("Bytes/msg: %in",bpm); printf("Overhead: %in",oh); printf("n"); } close(sfd[0]); close(sfd[1]); } int main() { int sfd[2]; socketpair(AF_UNIX,sfd); int sndbuf,(socklen_t*)&sbsize); printf("Buffer Size: %inn",sndbuf); close(sfd[0]); close(sfd[1]); for (size_t ii=4; ii <= 4096; ii *= 2) { run(ii); } } 这使: Buffer Size: 124928 Data Size: 4 Wrote: 423 Bytes/msg: 295 Overhead: 291 Data Size: 8 Wrote: 423 Bytes/msg: 295 Overhead: 287 Data Size: 16 Wrote: 423 Bytes/msg: 295 Overhead: 279 Data Size: 32 Wrote: 423 Bytes/msg: 295 Overhead: 263 Data Size: 64 Wrote: 423 Bytes/msg: 295 Overhead: 231 Data Size: 128 Wrote: 348 Bytes/msg: 358 Overhead: 230 Data Size: 256 Wrote: 256 Bytes/msg: 488 Overhead: 232 Data Size: 512 Wrote: 168 Bytes/msg: 743 Overhead: 231 Data Size: 1024 Wrote: 100 Bytes/msg: 1249 Overhead: 225 Data Size: 2048 Wrote: 55 Bytes/msg: 2271 Overhead: 223 Data Size: 4096 Wrote: 29 Bytes/msg: 4307 Overhead: 211 与管道相比,绝对有很多开销: Data Size: 4 Wrote: 16384 Bytes/msg: 4 Overhead: 0 Data Size: 8 Wrote: 8192 Bytes/msg: 8 Overhead: 0 Data Size: 16 Wrote: 4096 Bytes/msg: 16 Overhead: 0 Data Size: 32 Wrote: 2048 Bytes/msg: 32 Overhead: 0 Data Size: 64 Wrote: 1024 Bytes/msg: 64 Overhead: 0 Data Size: 128 Wrote: 512 Bytes/msg: 128 Overhead: 0 Data Size: 256 Wrote: 256 Bytes/msg: 256 Overhead: 0 Data Size: 512 Wrote: 128 Bytes/msg: 512 Overhead: 0 Data Size: 1024 Wrote: 64 Bytes/msg: 1024 Overhead: 0 Data Size: 2048 Wrote: 32 Bytes/msg: 2048 Overhead: 0 Data Size: 4096 Wrote: 16 Bytes/msg: 4096 Overhead: 0
看看插座(7)手册页。有一个部分如下:
所以看起来,开销仅仅是为了保存内核的簿记信息。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- angularjs – Angular2 TemplateRef选择器
- angular – 从选项卡转到根页面
- Bootstrap3 图片-响应式图片&图片形状
- 角度2:如何动态创建ViewContainerRef
- angularjs – ng网格水平滚动问题
- scala – 无法编译scrooge thrift插件生成的源代码
- bootstrap-4 – Bootstrap 4:如何在响应网格中制作固定列?
- scala – 是否在mutable.SynchronizedQueue线程安全上deque
- angular – ViewChildren传递多个组件
- TekTea’s Blog启用Show-UserAgent插件
- docker“实例”可以完全在ram中运行吗?
- unix – 如何使sed从脚本文件读取脚本?
- IE9 PathLocationStrategy Angular 4
- angularjs – AngularFire简单登录(电子邮件/密码
- angular – ng run test return error – TypeEr
- scala – 实例化混合特征正在编译,而单个特征则不
- angular – PrimeNG DataTable服务器端分页
- bash – 如何读取/ dev / urandom中的N个随机字符
- twitter-bootstrap – 在Laravel 4中使用Bootstr
- WebService学习之路二