弄个大新闻,批判一番


昨晚刷知乎看到这个问题关于高并发的两个问题?,于是点进去看了下,然后决定把高并发/大数据批判一番。

首先是问题中出现的一个链接单机千万并发连接,好恐怖有木有!!跟随这个链接爬到github看了看测试用的代码。

  • 其中服务端会fork出若干个子进程
  • 每个子进程有一个事件循环
  • 每个事件循环注册若干个服务端实例 (多少根据分配的端口来定)
  • 每个实例负责建立连接和通信

很高明呢!不过,看到多个进程同时监听同一个port的你可能会想“这怎么可能呢?”。其是不必大惊小怪,或许他测试的机器有好多块网卡,这样的话,只要ip不同就没问题了;当然他这里设置了SO_REUSEPORT,从3.9版本的内核开始引入的特性。

那么这就是单机千万并发连接了?**当然不是!!!**引用测试者的话

测试中如果一次性创建千万个连接,则绝大部分的连接创建都会失败,因此让客户端每100ms创建2000个连接,提高连接创建的成功率

什么?100ms创建2000个,这么说来1秒也就2万个呀,看标题单机千万并发连接,搞得这么玄乎,结果,所谓的并发也就是每秒20k的并发连接啊。。。吓的我赶紧用之前写的小程序试了试

c100k

看着watch监控中的数字变成200000用了时间大概是7秒左右,这200k是包括了服务端的和客户端的,这么算下来就一边来说也就是100k花了7秒,每秒也差不多有15k的并发连接啊,赶紧压压惊。。。
当然没有设置那么多参数,程序里只用了SO_RESUEADDR选项,就目前的asio来说,要设置SO_REUSEPORT可以这个做

    boost::asio::io_service io;
    tcp::acceptor acceptor(io);
    acceptor.open(tcp::v4());

    int on = 1;
    setsockopt(acceptor.native_handle(), SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &on, sizeof(on));

    acceptor.bind(tcp::endpoint(tcp::v4(), 8888));
    acceptor.listen();

那么回过来,继续批判。

看看这个回答(先引用,找到我再说删不删)

就当你这个千万级登陆是每秒一千万客户端要登陆。那么你只要坚持2分多钟,全国人民都在线了。假设全国是14亿人,每个人都来登陆一次,大约在一小时内登陆完,每秒才不到40万登陆。一千万登陆坚持一个小时就是360亿用户啊,现在问题来了,你有这么多用户么?

这说明什么?说明不切实际啊。

另外一个大数据相关的回答,也是笑喷了。

这些人的海量数据梗玩了这么多年也不更新一下。。。。。
上次一个学生去面试,让做题,其中一个是 100万个手机号码在一个文件中,每行一个,这样的大数据如何设计查询。。。。。
好恐怖的数据量,竟然有一百万那么多,中国的手机号码 11 位,一个号码加换行符一共 12 字节,要知道 FC 也就是苹果二代的内存也才 2000 字节,这数据量多么庞大!
太吓人了.... 这数据太大我不敢算, 让我们谷歌一下看看...
12m
我不是数据库专家,但是我见得多了,中国有几个需要用 hadoop 的公司。。。
都以为装个尾巴就是大灰狼了

还真是不得了的大数据啊!
另外评论区有人说这只是key,看来是要上MapReduce的节奏?


最后,这个问题的回答还是有干货的,反正我是已经关注了(严肃脸



转载请注明:Serenity » 弄个大新闻,批判一番