操作系统能否支持百万连接?

  • 时间:
  • 浏览:3

getchar();

if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1){

}

int base_port = atoi(argv[2]);

来控制 TCP 连接的发送和接收缓冲的大小(多谢 @egmkang).

for(int i=0; i

}

setsockopt(serv_sock, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize));

假设百万连接带有 20% 是活跃的, 每个连接每秒传输 1KB 的数据, 没法还要的网络速度是 0.2M x 1KB/s x 8 = 1.6Gbps, 要求服务器离米 是万兆网卡(10Gbps).

执行:

参考:

const char *ip = argv[1];

int main(int argc, char **argv){

第好多个多多数字 101747 就是当前系统的全局最大打开文件数(Max Open Files), 还可否看一遍, 只有 10 万, 有些有些, 在这台服务器上无法支持 C10000K. 有些有些系统的你这人数值更小, 为了修改你这人数值, 用 root 权限修改 /etc/sysctl.conf 文件:

输出:

/proc/sys/net/ipv4/tcp_rmem

if(++index >= 10){

编辑 /etc/security/limits.conf 文件, 加入如下行:

}

int index = 0;

continue;

int server_socks[MAX_PORTS];

usleep(1 * 10000);

addr.sin_port = htons((short)port);

第一列的 work 表示 work 用户, 让他填 *, 愿因 root. 后来 保存退出, 重新登录服务器.

printf("press Enter to continue: ");

struct sockaddr_in addr;

if(ret > 0){

总结

if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1){

int opt = 1;

if(connections % 100000 == 9999){

对于绝大帕累托图 Linux 操作系统, 默认请况下嘴笨 不支持 C10000K! 愿因操作系统带有最大打开文件数(Max Open Files)限制, 分为系统全局的, 和多多程序 级的限制.

maxfd = server_socks[i];

connections ++;

goto sock_err;

/proc/sys/net/ipv4/tcp_wmem

}

net.ipv4.netfilter.ip_conntrack_max = 10100000

下面来分别对这好多个问题图片进行分析.

int main(int argc, char **argv){

const char *ip = "0.0.0.0";

while(1){

}

return 0;

return 0;

51000 0 101747

int connections = 0;

全局限制

net.ipv4.ip_conntrack_max = 10100000

}

}

通过底下的测试代码, 还可否发现, 应用多多程序 维持百万个空闲的连接, 只会占用操作系统的内存, 通过 ps 命令查看可知, 应用多多程序 有一种几乎不占用内存.

多多程序 限制

if(argc <= 2){

当然, 这仅仅是理论分析, 实际的应用还要更多的内存和 CPU 资源来补救业务数据.

-bash: ulimit: open files: cannot modify limit: Operation not permitted

int bufsize;

fs.file-max = 10100000

会打印出类事下面的一行输出:

addr.sin_family = AF_INET;

}

exit(0);

Linux 系统还要修改内核参数和系统配置, 能够支持 C10000K. C10000K 的应用要求服务器离米 还要 2GB 内存, 愿因应用有一种还还要内存, 你这人要求应该是离米 10GB 内存. 并肩, 网卡应该离米 是万兆网卡.

printf("Usage: %s ip portn", argv[0]);

index = 0;

/*

说明当前 Linux 系统的每好多个多多多多程序 只有最多打开 1024 个文件. 为了支持 C10000K, 你同样还要修改你这人限制.

sock_err:

int base_port = 7000;

exit(0);

注意: Linux 内核源码中好多个多多常量(NR_OPEN in /usr/include/linux/fs.h), 限制了最大打开文件数, 如 RHEL 5 是 1048576(2^20), 有些有些, 要想支持 C10000K, 你愿因还还要重新编译内核.

服务器

补救了操作系统的参数限制, 接下来就要看看内存的占用请况. 首先, 是操作系统有一种维护哪好多个连接的内存占用. 对于 Linux 操作系统, socket(fd) 是好多个多多整数, 有些有些, 猜想操作系统管理一百万个连接所占用的内存应该是 4M/8M, 再包括有些管理信息, 应该会是 1000M 左右. 不过, 还有 socket 发送和接收缓冲区所占用的内存没法分析. 为此, 我写了最原始的 C 网络多多程序 来验证:

}

if(ret < 0){

注意, 服务器监听了 10 个端口, 这是为了测试方便. 愿因只有一台客户端测试机, 最多只有跟同好多个多多 IP 端口创建 100000 多个连接, 有些有些服务器监听了 10 个端口, 好多个多多一台测试机就还可否和服务器之间创建 1000 万个连接了.

int sock;

base_port = atoi(argv[1]);

cat /proc/sys/fs/file-nr

struct sockaddr_in addr;

在 Linux 下执行:

我测试 10 万个连接, 哪好多个连接是空闲的, 哪好多个数据就是发送就是接收. 这时, 多多程序 只占用了只有 1MB 的内存. 后来 , 通过多多程序 退出前后的 free 命令对比, 发现操作系统用了 1000M(大致)内存来维护这 10 万个连接! 愿因是百万连接话语, 操作系统有一种就要占用 2GB 的内存! 也即 2KB 每连接.

}

inet_pton(AF_INET, ip, &addr.sin_addr);

int ret = select(maxfd + 1, &readset, NULL, NULL, NULL);

客户端

printf("connections: %d, fd: %dn", connections, sock);

*/

work hard nofile 10100000

work soft nofile 10100000

1024

goto sock_err;

setsockopt(serv_sock, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize));

bzero(&addr, sizeof(addr));

printf("error: %sn", strerror(errno));

socklen_t optlen;

bufsize = 100000;

if(argc > 2){

socklen_t optlen;

}

printf("select error! %sn", strerror(errno));

int connections = 0;

int port = base_port + index;

int opt = 1;

printf("connect to %s:%dn", ip, port);

ulimit -n

char tmp_data[10];

临时修改

}else{

ulimit -n 10100000

不过, 愿因你全部都是 root, 愿因只有修改超过 1024, 会报错:

永久修改

for(int i=0; i maxfd){

还可否修改

int bufsize;

}

if(errno == EINTR){