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

Active Spinning and queue old bthread at the head for bthread mutex #2749

Merged
merged 1 commit into from
Sep 6, 2024

Conversation

chenBright
Copy link
Contributor

@chenBright chenBright commented Aug 29, 2024

What problem does this PR solve?

Issue Number:

Problem Summary:

golang mutex的演进中有两点优化:

  1. fast path没抢到锁的竞争者,进入slow path之后,立即再抢一次锁,不成功就阻塞在butex中,等下次唤醒在抢锁。进入slow path之后的第一次抢锁大概率是会失败的。[1]
  2. 被唤醒的队头竞争者跟新竞争者抢锁,大概率也是会失败。因为新竞争者占用着cpu且数量很多。如果将队头的竞争者放到队尾,显然不公平,甚至可能出现饥饿问题。[2]

What is changed and the side effects?

Changed:

  1. 进入slow path之后,如果worker线程本地调度队列为空,尝试自旋4次再抢锁,这对于临界区小的场景是有意义的。
  2. 被唤醒的队头竞争者抢锁失败后,会被重新放回队头。

Side effects:

  • Performance effects(性能影响):

  • Breaking backward compatibility(向后兼容性):


Check List:

  • Please make sure your changes are compilable(请确保你的更改可以通过编译).
  • When providing us with a new feature, it is best to add related tests(如果你向我们增加一个新的功能, 请添加相关测试).
  • Please follow Contributor Covenant Code of Conduct.(请遵循贡献者准则).

@chenBright chenBright force-pushed the opt_bthread_mutex branch 6 times, most recently from f3cceb5 to 51c8383 Compare August 30, 2024 14:32
@wwbmmm
Copy link
Contributor

wwbmmm commented Sep 2, 2024

有测试这个性能提升的效果吗?

@chenBright
Copy link
Contributor Author

chenBright commented Sep 3, 2024

有测试这个性能提升的效果吗?

  1. 自旋没啥效果,应该是因为触发条件比较苛刻,不好模拟。如果本地调度队列已经空了,进程负载应该不高,不自旋、多一次唤醒,问题也不大。不过mutex进入slow path之前自旋一小会,是经过业界验证过的优化手段,应该在条件满足的情况下,会有一点提升吧。
  2. 测试第二点优化,性能没变化。性能最好的应该是修改之前的,公平性一般会牺牲一些性能。性能和公平性是需要权衡的,golang为了公平性还引入了饥饿模式,让等待队列中饥饿(排队时间超过1ms)的协程直接获得锁,新来的协程直接入队。目前第二点优化了一个公平性的小问题,且不会降低性能,应该是可以接受的。

@wwbmmm
Copy link
Contributor

wwbmmm commented Sep 4, 2024

LGTM

@wwbmmm wwbmmm merged commit fea2952 into apache:master Sep 6, 2024
20 checks passed
@chenBright chenBright deleted the opt_bthread_mutex branch September 6, 2024 03:43
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

Successfully merging this pull request may close these issues.

2 participants