problem analysis:
- std::multimap<clock_type::time_point, TimeEvent> time_events
- time precision is nanoseconds
- in EventCenter::process_events function
- end_time > now : Nanosecond comparison
- std::chrono::microseconds>(end_time - now) :
- but converted to microseconds difference
- so timeout_microseconds = 0
- epoll_wait(..., 0) not sleep
- rados bench count : 6000
- Proportion of 0 events processed
-
41898337 /
44796903 = 93.52%
- osd single msgr worker thread cpu high to 100%
solution:
- due to epoll_wait is milliseconds
- add ms_time_events_min_wait_interval
to control how long time_events should wait at least
- so default value aligned to 1000 microseconds
- rados bench count : 6000
- Proportion of 0 events processed
- 424466 /
4489181 = 9.45%
- osd single msgr worker thread cpu high to 30~40%
issue: https://tracker.ceph.com/issues/62512
co-author: yanghonggang <yanghonggang_yewu@cmss.chinamobile.com>
Signed-off-by: zhangjianwei <zhangjianwei2_yewu@cmss.chinamobile.com>
desc: Inject a network congestions that stuck with N times operations
default: 0
with_legacy: true
+- name: ms_time_events_min_wait_interval
+ type: uint
+ level: dev
+ desc: In microseconds, msgr-worker's time_events min wait time for epoll_wait timeout
+ default: 1000
+ min: 0
+ max: 60000000
+ with_legacy: true
+- name: ms_client_throttle_retry_time_interval
+ type: uint
+ level: dev
+ desc: In microseconds, user client, the time interval between the next retry
+ when the throttle get_or_fail.
+ default: 5000
+ min: 1000
+ max: 60000000
+ with_legacy: true
- name: ms_blackhole_osd
type: bool
level: dev
if (end_time > now) {
timeout_microseconds = std::chrono::duration_cast<std::chrono::microseconds>(end_time - now).count();
+ timeout_microseconds = std::max<unsigned>(timeout_microseconds,
+ cct->_conf->ms_time_events_min_wait_interval);
} else {
timeout_microseconds = 0;
}
// short time, so we can wait a ms.
if (connection->register_time_events.empty()) {
connection->register_time_events.insert(
- connection->center->create_time_event(1000,
+ connection->center->create_time_event(cct->_conf->ms_client_throttle_retry_time_interval,
connection->wakeup_handler));
}
return nullptr;
if (connection->register_time_events.empty()) {
connection->register_time_events.insert(
connection->center->create_time_event(
- 1000, connection->wakeup_handler));
+ cct->_conf->ms_client_throttle_retry_time_interval,
+ connection->wakeup_handler));
}
return nullptr;
}
// short time, so we can wait a ms.
if (connection->register_time_events.empty()) {
connection->register_time_events.insert(
- connection->center->create_time_event(1000,
+ connection->center->create_time_event(cct->_conf->ms_client_throttle_retry_time_interval,
connection->wakeup_handler));
}
return nullptr;
// short time, so we can wait a ms.
if (connection->register_time_events.empty()) {
connection->register_time_events.insert(
- connection->center->create_time_event(1000,
+ connection->center->create_time_event(cct->_conf->ms_client_throttle_retry_time_interval,
connection->wakeup_handler));
}
return nullptr;
if (connection->register_time_events.empty()) {
connection->register_time_events.insert(
connection->center->create_time_event(
- 1000, connection->wakeup_handler));
+ cct->_conf->ms_client_throttle_retry_time_interval,
+ connection->wakeup_handler));
}
return nullptr;
}
// short time, so we can wait a ms.
if (connection->register_time_events.empty()) {
connection->register_time_events.insert(
- connection->center->create_time_event(1000,
+ connection->center->create_time_event(cct->_conf->ms_client_throttle_retry_time_interval,
connection->wakeup_handler));
}
return nullptr;