為什么你的etcd請(qǐng)求會(huì)超時(shí)

etcd請(qǐng)求出現(xiàn)高延遲

etcd的請(qǐng)求為何出現(xiàn)高延遲?
Leader在接收到的寫(xiě)請(qǐng)求,講一個(gè)日志條目復(fù)制到集群多數(shù)節(jié)點(diǎn)并應(yīng)用到存儲(chǔ)狀態(tài)的流程,會(huì)出現(xiàn)哪些情況導(dǎo)致請(qǐng)求超時(shí)?

  • Leader向從節(jié)點(diǎn)發(fā)消息:Leader需要并行將消息通過(guò)網(wǎng)絡(luò)發(fā)送給Follower節(jié)點(diǎn),依賴(lài)網(wǎng)絡(luò)性能;Leader需持久化日志條目到WAL,依賴(lài)磁盤(pán)IO順序?qū)懭胄阅堋?/li>
  • 應(yīng)用日志條目到存儲(chǔ)狀態(tài)機(jī)時(shí),etcd后端key-value存儲(chǔ)引擎是boltdb,boltdb是一個(gè)基于B+ Tree實(shí)現(xiàn)的存儲(chǔ)引擎,當(dāng)寫(xiě)入數(shù)據(jù)、提交事物時(shí),它會(huì)將
    dirty page持久化到磁盤(pán)中。
  • 在整個(gè)寫(xiě)流程過(guò)程中,etcd節(jié)點(diǎn)的cpu、內(nèi)存、網(wǎng)絡(luò)資源應(yīng)充足,否則可能也會(huì)影響性能。

定位網(wǎng)絡(luò)延時(shí)抖動(dòng)

使用ping/traceroute/mtr、ethtool、ifconfig/ip、netstat、tcpdump等命令獲取相關(guān)數(shù)據(jù)。

etcd應(yīng)用層提供了節(jié)點(diǎn)之間網(wǎng)絡(luò)統(tǒng)計(jì)的metrics指標(biāo):

指標(biāo) 解釋
etcd_network_active_peer peer之間活躍的連接數(shù)
etcd_network_peer_round_trip_time_seconds peer之間rtt延時(shí)
etcd_network_peer_send_failures_total peer發(fā)送的失敗消息數(shù)
etcd_network_client_grpc_send_bytes_total server發(fā)送給client的總字節(jié)數(shù)
etcd_network_client_grpc_received_bytes_total server接收到client的總字節(jié)數(shù)

網(wǎng)絡(luò)質(zhì)量導(dǎo)致etcd性能:

  • expensive request中的大包查詢(xún)會(huì)使網(wǎng)卡出現(xiàn)瓶頸,產(chǎn)生丟表等錯(cuò)誤,從而導(dǎo)致etcd吞吐量下降、高延時(shí),這是因?yàn)闃I(yè)務(wù)沒(méi)有遵循最佳實(shí)踐,查詢(xún)了大量key-value。
  • 在跨故障部署的時(shí)候,故障域可能是可用區(qū)、城市,各個(gè)節(jié)點(diǎn)的RTT越高,請(qǐng)求的延時(shí)跟高。

磁盤(pán)I/O

etcd_disk_wal_fsync_duration_seconds(表示W(wǎng)AL日志持久化的fsync系統(tǒng)調(diào)用延時(shí)數(shù)據(jù))
和etcd_disk_backend_commit_duration_seconds(后端boltdb事物提交的延時(shí))觀(guān)察應(yīng)用層寫(xiě)入磁盤(pán)的性能。

如果etcd的WAL模塊在fdatasync操作超過(guò)1秒時(shí),將相應(yīng)的日志輸出。

etcd_disk_backend_commit_duration_seconds指標(biāo)的異常時(shí),說(shuō)明事物提交過(guò)程中的B+ Tree樹(shù)重平衡、分裂、持久化dirty page、持久化meta
page 等操作耗費(fèi)了大量時(shí)間。

etcd_disk_backend_commit_duration_seconds較高、etcd_disk_wal_fsync_duration_seconds正常,說(shuō)明B+ Tree的重平衡、分裂過(guò)程中的
較高時(shí)間復(fù)雜度邏輯操作導(dǎo)致。

disk_backend_commit_rebalance_duration和disk_backend_commit_spill_duration分別表明事物提交過(guò)程中B+ Tree的重平衡和分裂操作
耗時(shí)分布區(qū)間。

etcd_disk_wal_fsync_duration_seconds記錄的是WAL文件順序?qū)懭氲某志没瘯r(shí)間, etcd_disk_backend_commit_duration_seconds記錄
的是整個(gè)事物提交的耗時(shí)。

Expensive request

etcd 3.2和etcd 3.3版本寫(xiě)請(qǐng)求完成之前,需要更新MVCC的buffer,進(jìn)行升級(jí)鎖操作。然而此時(shí)若集群中出現(xiàn)一個(gè)long expensive read request,
則會(huì)導(dǎo)致寫(xiě)請(qǐng)求延時(shí)抖動(dòng)。

在etcd 3.4中,logger默認(rèn)為capnslog,trace特性只有在當(dāng)logger為zap時(shí)才開(kāi)啟,因此你需要設(shè)置--logger=zap。
trace特性不能記錄所有類(lèi)型的請(qǐng)求,目前只覆蓋了MVCC模塊中的range/put/txn等常用接口。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容