zoukankan      html  css  js  c++  java
  • .net如何处理高并发socket,建立高性能健壮的socket服务

    看到一个问题,说如何保持5000-10000+的健壮的socket服务。

    初学者肯定是会把每个连接都开一个线程来监听。这很浪费资源

    通常只会(动态地)占用几个线程就能保持3000个长连接会话了。
    “为每个监听对象开一个新的线程”这是设计错误。你可以使用NetworkStream的异步Read,在没有消息的时候无需阻塞在什么线程里。

    据不同的操作系统,多线程的约束条件也不同。当你发现工作线程超过1000个,或者IOCP(IO完成端口)线程超过800个,就应该赶紧断掉服务器进行维护了。
    首先要有一个意识,使用几个、十几个线程就足以应付上千个普通业务连接了。
    有人说“如果我要保持1000个客户端连接,就得开1001个线程来接收数据”,这纯粹是瞎扯。请一定要注意。

    我说的“工作线程”是指你的进程中使用的工作线程总数,而不是只windows的。

    在你的windows中,总线程数超过1500个是经常有的事情。你可以打开你的进程管理器看看cpu的指标,看看当前有多少线程在切换使用。很可能超过1500个。但是可以监视每一个单个的进程,看看它的线程数,通常只有10个左右(只有System线程数会有100多)。

    而你的服务器进程,工作线程数不应该太高。平常只有十几个线程足以应对几千客户端了。

  • 相关阅读:
    Spring视频学习笔记(一)
    枚举(enum)与类的静态成员(static)
    Java的继承模式
    HTML锁定Table中某一列
    Winform 中的KeyDown
    我的WebService入门
    获取键盘或鼠标多久没有对屏幕进行操作了
    从DB输出值到DataTable时,字段值为NULL时报错相关信息;
    Data层相关问题 & JS循环取值
    字符串String的trim()方法
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/8310740.html
Copyright © 2011-2022 走看看