Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于swoole启动时创建的几个进程,想多了解一些内在。 #5616

Closed
marol1210 opened this issue Dec 12, 2024 · 3 comments
Closed

Comments

@marol1210
Copy link

  1. What did you do? If possible, provide a simple script for reproducing the error.

启动swoole, 会创建如下进程关系图
image

以下问题在swoole文档中没有获得详细说明, 希望能得到热心朋友您的解答,万分感谢。

1) 多核CPU时,swoole在创建多个reactor线程时是否为每个reactor线程指定了某一CPU core去执行(是否如网上说的可通过affinity实现),因此reactor线程可以做到并行运行(Parallelism)

2)Server->on('EVENT_NAME')中注册的事件, 部分事件是由reactor线程的event-loop触发,部分是由代码逻辑控制的对吗?
个人把注册的事件理解为key=>val的映射。
因此当注册"workerstart"后,每当成功创建worker就会触发相应的workerstart回调(程序根据进程创建函数返回的结果决定是否调用)。
而当注册 "request"后,每当reactor线程通过epll_wait返回待请求的fd ,就会在所谓的循环”event-loop“中依次调用request回调 , 所以Server->on('EVENT_NAME')中注册的事件是根据实际上下文触发的。

@NathanFreeman
Copy link
Member

第一个不指定某一CPU core也是并行运行的
第二个的话有些回调函数是在reactor线程触发的,像close事件,request事件是在worker进程触发的
程序会根据是否设置了回调函数从而执行某个回调函数

@marol1210
Copy link
Author

第一个不指定某一CPU core也是并行运行的 第二个的话有些回调函数是在reactor线程触发的,像close事件,request事件是在worker进程触发的 程序会根据是否设置了回调函数从而执行某个回调函数

好人 @NathanFreeman , 感谢。 以下问题问完就结束,需要消化。

可否这样理解问题一: 假如CPU有2个core , swoole创建了2个reactor线程。 由于某种规则的实现,当一个核执行reactor1后,另一个核只能执行reactor2。

问题二: 那么event-loop是在哪里执行或所属于哪一块程序运行的部分(文档中说, 每个reactor线程会单独维护一个自身的event-loop,因此会存在多个event-loop)? ”request事件是在worker进程触发的“ 是不是在event-loop中分配给了worker , 如果worker处理不够快,event-loop中会不会积压待处理的请求fd。

@NathanFreeman
Copy link
Member

一般除非你自己设置,不然reactor在哪个CPU执行是随机的,绑定CPU的好处是可以避免上下文的开销,但是问题就是如果CPU0特别忙,使用率已经100%,但是CPU1特别空闲,那么还不如将两个reactor线程都在CPU1执行,可能都快一点。

event-loop在epoll.cc/select.cc/keuque.cc/poll.cc这里启动,每个reactor线程是会维护一个自身的event-loop,用于接受主线程发送过来的连接,接收客户端的数据和进程通过socket通信。event-loop不会分配事件给进程的,是代码写死了request事件要在worker进程触发。event-loop只告诉进程连接是否可读可写,进程赶紧过来读数据或者写入数据。

处理不够快是会积压待处理的请求fd的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants