-
Notifications
You must be signed in to change notification settings - Fork 3.2k
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
4.5.11版本swoole 服务请求无响应 #4716
Comments
请使用 strace / gdb 跟踪一下进程的状态 |
[root/]# strace -p 200162 |
看起来好像是因为skywaiking-php-sdk 这个扩展的flock导致的死锁。 |
当我的swoole版本为4.0时,编译出来的skywaiking-php-sdk是可以正常使用的。我升级4.5后,编译对应版本的skywalking后,出现了这个问题 |
有skywaiking-php-sdk这个的下载网址吗 |
我发您一份源码? |
mariasocute@163.com,这是我的邮箱,如果源码有隐私信息,请记得去掉 |
已发送,谢谢 |
`[root]# gstack 1647 Thread 6 (Thread 0x7fba19088700 (LWP 1654)): —————————— |
这里是因为有个flock()之后又调用了sleep(),导致死锁了。 |
我的服务没有使用Swoole\Lock(),但有开启协程的逻辑,大致如下: |
不是Swoole\Lock()引起的,是php自带的flock()函数引起的 |
是写日志的flock+sleep引起的吗 |
'enable_preemptive_scheduler' => 1 |
不是,抢占式调度是为了避免协程死循环占用CPU而设置的。 |
我服务里只有写日志用到了flock,swoole版本从4.0升级到4.5后,没有其他改动。这里有可能是什么版本问题吗 |
1、进程A写日志进行flock |
这里要看看代码,看看有没有sleep()+flock(),如果没有sleep(),那就有可能是设置了enable_preemptive_scheduler让出CPU了 |
确认没有sleep()+flock()。那么enable_preemptive_scheduler不是很容易触发以上问题?有没有解决方法呢
|
如果协程的代码没有 CPU 密集型代码,enable_preemptive_scheduler这个可以不开 |
存在 CPU 密集型代码的,因此升级了swoole版本,采用enable_preemptive_scheduler的方案哈 |
应该是某个协程获得锁的时间太长了没有释放,导致线程池中的线程都被flock()挂起来了,所以进程都死锁了 |
如果仍希望使用enable_preemptive_scheduler,有没有解决方法。 |
看看可不可以记录完日志就马上释放锁。 |
看看能不能把写日志的任务投递给task进程 |
另外swoole 4.5.11出现下面的告警,请帮忙看下 |
https://wiki.swoole.com/#/other/issue?id=关于段错误核心转储 |
(gdb) |
(gdb) f 0 |
感觉看起来像是没有make clean swoole,因为安装的是4.5.11,但是bt中显示的是4.0.0的路径。 |
php的版本有更新过吗 |
在request请求中,开启了协程,就会发生worker退出的问题。如下面这段代码。这是什么原因? |
请不要使用 4.0.0 版本了,更新至最新的 4.8.10 |
升级新版本是可以解决进程异常退出的问题。另外enable_preemptive_scheduler和写日志发flock(引用公共库,不会进行大改)造成的死锁问题在高并发场景下,是比较容易遇到的。
|
@Frank-JY 请暂时关闭enable_preemptive_scheduler,这个功能需要谨慎使用,尤其是大量使用第三方库时,可能会在任意一行 php 代码执行过程中发生协程切换,而第三方库部分代码可能是不可重入的,引起一些 bug。 而关闭 enable_preemptive_scheduler 之后,只会在发生 IO 阻塞的位置产生协程切换,更安全一些。 |
Please answer these questions before submitting your issue.
swoole版本为4.5.11, 服务开启了抢占型协程
服务启动一段时间后,请求不同,无法正常响应。master、worker进程都在,端口仍被占用。但请求不通。
![image](https://user-images.githubusercontent.com/20394301/169005144-5a16410f-34bc-438d-a9ab-67cfe2b2b8ee.png)
排查后发现worker被锁。
kill掉一个worker后,有一定几率请求成功。
希望了解worker为什么被锁,以及怎么解决问题
swoole服务正常,请求正常响应
服务worker锁死,请求无法正常响应
php --ri swoole
)?uname -a
&php -v
&gcc -v
) ?The text was updated successfully, but these errors were encountered: