Need a paper, with Baozi as return# Chemistry - 化学
S*A
1 楼
这个练习1 已经发现了,C10M 没有强壮的内存支持是
没戏的。单单是 kernel 部分就已经消耗很多内存了。
所以我们把目标调整一下,1M per 4G RAM。
这样 64G 内存就有可能实现 10M。
练习2 就是看看,我们如果保留 1M/4G 的空TCP
连接,可不可以。完全不往 TCP 里面发东西。就是
建立连接而已。这样也不存在 epoll 问题。
和实验1一样,我会发些拍脑瓜想出来的简单代码。
你直接用这个代码冲刺 1M/4G 会碰到些实际问题。
有兴趣的同学跟着做一下实验,看看有没有办法解
决这些问题。
BTW,我是实验出了 1M/4G (服务器方),所以是
有可能的。建立1M 连接还花了不少时间。
服务器方代码。端口是80, 大家可以自己改。
include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void die(char *reason)
{
perror(reason);
exit(1);
}
int main(int argc, char *argv[])
{
int listen_sock, conn_sock;
struct sockaddr_in raddr, localaddr = {
.sin_family = PF_INET,
.sin_port = ntohs(80),
.sin_addr.s_addr = INADDR_ANY
};
int ret;
socklen_t addrlen = sizeof(raddr);
int lisnum = 10;
struct rlimit r;
int i;
int yes = 1;
listen_sock = socket(PF_INET, SOCK_STREAM, 0);
if (listen_sock < 0)
die("socket");
setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
ret = bind(listen_sock, (struct sockaddr *) &localaddr, sizeof(struct
sockaddr));
if (ret < 0)
die("bind");
ret = listen(listen_sock, lisnum);
if (ret < 0)
die("listen");
for (i = 0; i < 1000000; i++) {
conn_sock = accept(listen_sock,
(struct sockaddr *)
&localaddr, &addrlen);
if (conn_sock < 0)
die("accept");
if ((i%10000) == 0 || i < 10)
printf("%dn", i);
}
return 0;
}
没戏的。单单是 kernel 部分就已经消耗很多内存了。
所以我们把目标调整一下,1M per 4G RAM。
这样 64G 内存就有可能实现 10M。
练习2 就是看看,我们如果保留 1M/4G 的空TCP
连接,可不可以。完全不往 TCP 里面发东西。就是
建立连接而已。这样也不存在 epoll 问题。
和实验1一样,我会发些拍脑瓜想出来的简单代码。
你直接用这个代码冲刺 1M/4G 会碰到些实际问题。
有兴趣的同学跟着做一下实验,看看有没有办法解
决这些问题。
BTW,我是实验出了 1M/4G (服务器方),所以是
有可能的。建立1M 连接还花了不少时间。
服务器方代码。端口是80, 大家可以自己改。
include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
void die(char *reason)
{
perror(reason);
exit(1);
}
int main(int argc, char *argv[])
{
int listen_sock, conn_sock;
struct sockaddr_in raddr, localaddr = {
.sin_family = PF_INET,
.sin_port = ntohs(80),
.sin_addr.s_addr = INADDR_ANY
};
int ret;
socklen_t addrlen = sizeof(raddr);
int lisnum = 10;
struct rlimit r;
int i;
int yes = 1;
listen_sock = socket(PF_INET, SOCK_STREAM, 0);
if (listen_sock < 0)
die("socket");
setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes);
ret = bind(listen_sock, (struct sockaddr *) &localaddr, sizeof(struct
sockaddr));
if (ret < 0)
die("bind");
ret = listen(listen_sock, lisnum);
if (ret < 0)
die("listen");
for (i = 0; i < 1000000; i++) {
conn_sock = accept(listen_sock,
(struct sockaddr *)
&localaddr, &addrlen);
if (conn_sock < 0)
die("accept");
if ((i%10000) == 0 || i < 10)
printf("%dn", i);
}
return 0;
}