apache / apache/pulsar-client-cpp

[pulsar-client-cpp] Excessive locking cause significant performance degradation

Đang mở
#116 3 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
C++
Star
71
Fork
90
Merge trung bình
2 giờ 33 phút
Pull request đã merge (30 ngày)
3

Mô tả

**Describe the bug**
Implementation of statistics in cpp client have two concurrency issues.

1. ProducerStatsImpl (and ConsumerStatsImpl) classes use a single shared lock to protect access to internal data. The lock is taken on each sent or received message. Under high load this shared lock causes signficant contention and performance degradation.
Profiler shows that sending and receiving threads block each-other.

![original-profiling](https://user-images.githubusercontent.com/2276675/142137028-b1dab92d-d6a4-47c3-84fd-666bccfd188a.png)

Since sending and receving functions access different member subset they should be protected by different mutex or other approach should be selected.
As example after patching issue I've got about 1/3 throughtput improvement. As you can see on screenshot below threads are witing on I/O but not on mutexes.
![pathed-profiling](https://user-images.githubusercontent.com/2276675/142137475-36f31817-29da-43d5-9ddd-ecbbb4948d8b.png)

2. ProducerStatsImpl implementation has races between destructor and DeadlineTimer callback. Consider following scenario:

1. ProducerStatsImpl destructor acquire the mutex
2. DeadlineTimer calls calback flushAndReset and blocked on mutex
3. ProducerStatsImpl calls timer.cancel and cancel any pending operation but it cannot cancel already executed callback at step 2
4. ProducerStatsImpl destructor release mutex
5. DeadlineTimer acquire the mutex
6. ProducerStatsImpl destructor destroy object
7. DeadlineTimer callback access to deallocated memory

Are you willing accept PR for issue number one or both?

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Read the ProducerStatsImpl and ConsumerStatsImpl implementations and their DeadlineTimer callback path first. Use high-load profiling to verify lock contention; done means reducing send/receive mutex contention and preventing callbacks from accessing destroyed ProducerStatsImpl, for the accepted scope.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
cpp
Lĩnh vực
distributed-systems, performance
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.