- 主题:boost/asio的协程调试非常麻烦,有没什么法子
就是阻塞一个线程。协程并不绑定线程。IO很快就会完成,不过退化成线程池模式。就一个任务而言,使命必达不容夭折,其他任务可以等其他线程。而且同步只影响这一次IO。下次还可以恢复异步。
【 在 poocp 的大作中提到: 】
: 每个同步IO会阻塞一条线程的所有协程,所以全部线程/协程被阻塞的概率是存在的。
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
你这种太麻烦。
【 在 poocp 的大作中提到: 】
: 更好的方案是将异步IO失败的链接从处理中移除,放在单独的线程/协程里排队做同步IO重试,这样它们只会阻塞自己,不会影响主要工作线程。
:
--
FROM 221.218.60.*
线程池有个数据结构来管理,里边有线程id。
tid=pthread_self();
得到当前线程的ID,在线程池里查询这个id,找到了,就利用这项数据进行yield。
找不到,就说明当前线程不是线程池里的线程,函数自动进入同步IO状态。
反正,IO是必须完成的,不管用什么方式。
【 在 DoorWay 的大作中提到: 】
: 检查当前线程id,和存储的线程数据?
: 线程数据里,包含了了协程帧的堆栈信息?
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
怎么说呢?原本构建大并发的服务器系统,当然是要能够充分发挥多核系统的性能,肯定是先有多线程需求的吧。
单线程也可以对付大量链接,但是发挥不了多核的性能。
【 在 dajun 的大作中提到: 】
: 弱问是业务需要读完再做其他耗时的操作才选择多线程的吗?
: 没用过boost.asio,猜测他应该是能单线程应对大量连接的吧(非协程)
: 发自「今日水木 on SunOS 5.6」
--
FROM 221.218.60.*
【 在 poocp 的大作中提到: 】
: 总之你这个模型被DoS的代价比较低,所以我建议你简化。
:
我的服务器方案,由主线程创建线程池,context等等,线程池由epoll调度。
主线程守护监听socket。由select监听。收到事件取一个context,然后用这个context 进行accept,并记录时间戳,,把这个context投入epoll,交给线程池处理。
在DDOS攻击期间,context可能被迅速耗尽,这时主线程取不出来context,就进入一个循环,不断进行timeout检测,检测发生timeout的contex,收拾出来垃圾再继续处理。
被accept的socket,必须在一定时间内对口令,超时被踢。
已经完成认证的socket就在epoll的事件循环中完成它们的任务,不受ddos攻击的影响。期间accept是有卡顿的,不过几秒钟后就会有大批的无效socket被踢,accept可以迅速恢复。
不知道你们的单线程协程是怎么抵抗DDOS攻击的。
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
DDoS攻击包有两种,一种是连接后不发信息,占死你有限连接数。
另一种是进行https协议。
这两种攻击包都可以对付。
【 在 ylh1969 的大作中提到: 】
: 我的服务器方案,由主线程创建线程池,context等等,线程池由epoll调度。
: 主线程守护监听socket。由select监听。收到事件取一个context,然后用这个context 进行accept,并记录时间戳,,把这个context投入epoll,交给线程池处理。
: 在DDOS攻击期间,context可能被迅速耗尽,这是主线程取不出来context,就进入一个循环,不断进行timeout检测,检测发生timeout的contex,收拾出来垃圾再继续处理。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
还一个办法,做通用工具,好容易调好一个,以后到处用。
【 在 Algoquant 的大作中提到: 】
: 报错了,指出了哪行报错,但是压根儿不知道是从哪个上次函数调用结束resume回来的,也就是不知道导致此报错的可能前面步骤是哪执行的(前面做了什么操作导致 线程恢复的时候 用到的资源不存在或者被释放了),调式相当痛苦,日志异步的,好像也没打印同步到出错的线程时执行了哪些操作?
: 有没经验分享一下?
--
FROM 221.218.60.*
主要是线程池就有不多的几个线程,主要是利用epoll,有数据激活才开始工作,一般也没问题。就是有用户在应用中自行发起readnet,要求他们进行异步操作,把任务交给epoll,然后暂时放弃当前线程,用回调函数继续后续任务,有点困难。
之前搞了串珠模型,任务是珠子,epoll是链子,所需的钩子工具都有,就是推不开。
【 在 DoorWay 的大作中提到: 】
: 这个线程池不用协程实现,会损失性能?
: 我的想法是,精巧的代码,得想4个月,不如用10000行平常的代码代替。
: 好调试。
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
if (epoll_ctl(epollFd, EPOLL_CTL_ADD, listenFd, &event)) {
throw std::runtime_error("Failed to add listenFd to epoll");
}
这句话删除,在运行函数里已经有了select守候。
【 在 Algoquant 的大作中提到: 】
: 以下由ds生成:
: #include <iostream>
: #include <thread>
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
先启动线程池,后启动server。
在取不到context时,立即启动timeout检测,然后继续取,循环,不得不休。它这样处理超时,刚刚accept的fd就丢了。这个fd如果恰好是夹杂在ddos中的正常fd呢?岂不中招。
这可以提出来要求它改。
【 在 Algoquant 的大作中提到: 】
: 使用asio 代码清爽多了,linux裸代码 一堆fd操作 看着就头大。
: #include <iostream>
: #include <memory>
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*