国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

雙緩沖隊(duì)列異步日志系統(tǒng):高并發(fā)場(chǎng)景下徹底解決同步日志阻塞問(wèn)題

雙緩沖隊(duì)列異步日志系統(tǒng):高并發(fā)場(chǎng)景下徹底解決同步日志阻塞問(wèn)題 1. 先別急著一股腦寫(xiě)文件同步日志為什么扛不住生產(chǎn)環(huán)境先說(shuō)結(jié)論再聊細(xì)節(jié)日志系統(tǒng)最容易被低估也最容易被埋雷。很多項(xiàng)目剛開(kāi)始的時(shí)候日志就是到處printf或者更“規(guī)范”一點(diǎn)接個(gè)log4j、spdlog級(jí)別的庫(kù)線上跑一跑也沒(méi)覺(jué)得有什么問(wèn)題。但等流量上來(lái)高并發(fā)場(chǎng)景一壓第一塊倒下的往往不是業(yè)務(wù)代碼而是看似人畜無(wú)害的日志鏈路。我們做雙緩沖隊(duì)列異步日志系統(tǒng)要解決的核心痛點(diǎn)很簡(jiǎn)單日志寫(xiě)入不再阻塞業(yè)務(wù)線程。同步日志為什么會(huì)阻塞因?yàn)閣rite()到磁盤(pán)并不便宜。一個(gè)日志條目看起來(lái)只是一行字符串但這條字符串從用戶(hù)態(tài)的日志緩沖區(qū)到內(nèi)核的文件系統(tǒng)緩存再到真正的磁盤(pán)設(shè)備中間隔著至少兩道拷貝還伴隨一次系統(tǒng)調(diào)用。生產(chǎn)環(huán)境里無(wú)論是機(jī)械硬盤(pán)還是 SSD單次寫(xiě)入的小 IO 都遠(yuǎn)沒(méi)有想象中的快。日志一多、高頻一寫(xiě)業(yè)務(wù)線程就被迫排隊(duì)等磁盤(pán)。我舉個(gè)真實(shí)場(chǎng)景某線上服務(wù)需要記錄每次請(qǐng)求的完整參數(shù)和響應(yīng)體單個(gè)請(qǐng)求撐死幾十行日志但 QPS 上了幾千之后同步日志的磁盤(pán)寫(xiě)壓力瞬間拉滿(mǎn)接口平均耗時(shí)從 2ms 漲到了 40ms最夸張的時(shí)候業(yè)務(wù)線程被日志卡的連心跳包都發(fā)不出去。后來(lái)把策略改成“攢一批再寫(xiě)”問(wèn)題才算緩解。這就是異步日志的核心思路把日志寫(xiě)入從業(yè)務(wù)線程上搬走交給專(zhuān)門(mén)的線程去處理。業(yè)務(wù)線程只負(fù)責(zé)把日志內(nèi)容往內(nèi)存里一放就返回磁盤(pán)寫(xiě)入由后臺(tái)線程異步完成。聽(tīng)起來(lái)簡(jiǎn)單但實(shí)現(xiàn)上有很多講究尤其是“怎么把日志內(nèi)容安全高效地交到后臺(tái)線程”這一步選型不同效果天差地別。雙緩沖隊(duì)列就是這條鏈路里比較經(jīng)典、也比較容易理解的一種實(shí)現(xiàn)方案。如果你現(xiàn)在正被“日志寫(xiě)入拖慢接口”“日志一多系統(tǒng)就卡頓”“日志模塊與業(yè)務(wù)模塊共用鎖導(dǎo)致死等”這些問(wèn)題困擾這篇文章適合你。我會(huì)從設(shè)計(jì)思路講到接口封裝再到部署使用把雙緩沖日志系統(tǒng)的“上半場(chǎng)”講透。2. 雙緩沖隊(duì)列的工作機(jī)制把“寫(xiě)日志”和“寫(xiě)磁盤(pán)”拆開(kāi)2.1 兩段式緩沖一個(gè)正寫(xiě)一個(gè)在刷雙緩沖隊(duì)列這個(gè)名字關(guān)鍵在于“雙”和“隊(duì)列”。“緩沖”比較好理解就是一塊預(yù)先分配好的內(nèi)存。日志內(nèi)容先落在這塊內(nèi)存里攢多了再一次性寫(xiě)入磁盤(pán)。為什么要攢因?yàn)橐淮蝫rite()寫(xiě)入 1MB 數(shù)據(jù)和分 1 萬(wàn)次每次寫(xiě) 100 字節(jié)兩者的 IO 效率完全是兩個(gè)量級(jí)。批量寫(xiě)不僅能大大減少系統(tǒng)調(diào)用的次數(shù)還能讓磁盤(pán)的寫(xiě)模式更規(guī)整性能提升非常明顯?!半p緩沖”指的是這塊預(yù)分配內(nèi)存有兩份。一份被業(yè)務(wù)線程用來(lái)寫(xiě)入日志稱(chēng)為“待寫(xiě)緩沖區(qū)”或“當(dāng)前緩沖區(qū)”另一份被后臺(tái)線程用來(lái)讀取并刷入磁盤(pán)稱(chēng)為“待刷緩沖區(qū)”。當(dāng)“當(dāng)前緩沖區(qū)”寫(xiě)滿(mǎn)了或者到了固定時(shí)間系統(tǒng)會(huì)執(zhí)行一次緩沖區(qū)交換swap把業(yè)務(wù)線程寫(xiě)滿(mǎn)的這塊換成后臺(tái)線程手里的那塊。交換之后業(yè)務(wù)線程繼續(xù)往新?lián)Q來(lái)的空緩沖區(qū)里寫(xiě)后臺(tái)線程則拿著裝滿(mǎn)日志的緩沖區(qū)去刷磁盤(pán)。圖景大概是這樣業(yè)務(wù)線程 后臺(tái)線程 | | | 寫(xiě)入Buffer A | |-------------| | Buffer A滿(mǎn) | | 交換 | |-------------| | 寫(xiě)入Buffer B | | | 刷Buffer A到磁盤(pán) | |------------- Disk簡(jiǎn)化成文字描述就是業(yè)務(wù)線程永遠(yuǎn)只面對(duì)一塊“可以寫(xiě)”的內(nèi)存寫(xiě)完一塊就換一塊完全不碰磁盤(pán) IO。后臺(tái)線程永遠(yuǎn)只面對(duì)一塊“已經(jīng)寫(xiě)滿(mǎn)”的內(nèi)存刷完一塊就換一塊完全不阻塞業(yè)務(wù)線程。兩者之間只有一次極短的交換操作需要同步。2.2 為什么是“雙”緩沖而不是單緩沖或多緩沖單緩沖的方案看起來(lái)也能用一塊緩沖區(qū)寫(xiě)滿(mǎn)了就刷盤(pán)刷盤(pán)期間業(yè)務(wù)線程等著。但問(wèn)題在于“寫(xiě)滿(mǎn)后刷盤(pán)”這個(gè)動(dòng)作是阻塞的而且刷盤(pán)耗時(shí)不定。一旦磁盤(pán)繁忙業(yè)務(wù)線程就卡住了和同步日志沒(méi)有本質(zhì)區(qū)別只是把fprintf換成了memcpy仍然治標(biāo)不治本。多緩沖方案呢理論上可以準(zhǔn)備 N 塊緩沖區(qū)寫(xiě)滿(mǎn)一塊就換下一塊后臺(tái)線程依次刷。這能進(jìn)一步降低交換頻率內(nèi)存占用也更高。但在大部分場(chǎng)景下兩塊緩沖區(qū)已經(jīng)足夠只要后臺(tái)線程刷盤(pán)的平均速度大于業(yè)務(wù)線程寫(xiě)入的平均速度兩塊就能循環(huán)起來(lái)。如果后臺(tái)線程的消費(fèi)速度跟不上說(shuō)明系統(tǒng)已經(jīng)到了日志量過(guò)載的狀態(tài)即使準(zhǔn)備更多緩沖區(qū)也只是延緩問(wèn)題并不能消除問(wèn)題。這里有個(gè)很多人會(huì)忽略的點(diǎn)雙緩沖系統(tǒng)里的交換是“一次性”完成的。生產(chǎn)線程與消費(fèi)線程之間只共享一個(gè)狀態(tài)指針一次 swap 操作只需要幾納秒到幾十納秒的臨界區(qū)保護(hù)。對(duì)比直接用std::queue存日志的逐條入隊(duì)方案雙緩沖避免了高頻的鎖競(jìng)爭(zhēng)把鎖的粒度從“每條日志”降到了“每批日志”這是它能扛高吞吐的根本原因。另外雙緩沖天然支持延遲刷新。很多時(shí)候日志峰值只出現(xiàn)在一秒內(nèi)的某幾百毫秒中其他時(shí)間業(yè)務(wù)線程并不忙。如果每寫(xiě)一條就通知后臺(tái)線程來(lái)取線程喚醒、上下文切換的成本反而會(huì)拖垮性能。雙緩沖方案可以設(shè)定“緩沖區(qū)未滿(mǎn)就定時(shí)刷”比如每 1 秒強(qiáng)制交換一次保證日志延遲可控且不會(huì)出現(xiàn)長(zhǎng)時(shí)間無(wú)輸出。2.3 雙緩沖的兩個(gè)隱藏風(fēng)險(xiǎn)設(shè)計(jì)時(shí)繞不開(kāi)第一個(gè)風(fēng)險(xiǎn)是日志丟失。異步意味著業(yè)務(wù)線程返回時(shí)日志還沒(méi)落盤(pán)如果此時(shí)進(jìn)程崩潰或者被kill -9最后一段還在內(nèi)存里的日志就沒(méi)了。這個(gè)問(wèn)題沒(méi)法完全規(guī)避只能降低損失。常見(jiàn)做法是后臺(tái)線程定期刷盤(pán)并且支持外部顯式調(diào)用Flush()在需要保命的關(guān)鍵節(jié)點(diǎn)比如服務(wù)收到終止信號(hào)后強(qiáng)制把所有緩沖數(shù)據(jù)落盤(pán)。第二個(gè)風(fēng)險(xiǎn)是背壓?jiǎn)栴}。如果日志生產(chǎn)速度長(zhǎng)期超過(guò)消費(fèi)速度緩沖區(qū)很快會(huì)處于“寫(xiě)滿(mǎn)-交換-刷盤(pán)-再寫(xiě)滿(mǎn)”的循環(huán)表現(xiàn)為磁盤(pán)持續(xù)高負(fù)載系統(tǒng)整體性能下降。此時(shí)不能無(wú)限等下去常見(jiàn)策略是當(dāng)兩緩沖都占滿(mǎn)且后臺(tái)線程來(lái)不及刷時(shí)要么直接丟棄未來(lái)日志并按計(jì)數(shù)報(bào)錯(cuò)要么將當(dāng)前緩沖區(qū)擴(kuò)容一擋臨時(shí)救急。我一般推薦前者因?yàn)槿罩玖窟^(guò)載時(shí)保留完整性的優(yōu)先級(jí)低于保證業(yè)務(wù)可用性而且丟失提示本身也是重要日志。3. 核心接口設(shè)計(jì)Buffer、隊(duì)列交換與 AsyncLogger設(shè)計(jì)雙緩沖日志系統(tǒng)時(shí)最重要的是把三個(gè)角色拆清楚Buffer負(fù)責(zé)存儲(chǔ)字節(jié)流BufferQueue負(fù)責(zé)管理兩個(gè) Buffer 的交換與調(diào)度AsyncLogger負(fù)責(zé)向上層業(yè)務(wù)提供日志寫(xiě)入 API同時(shí)管理后臺(tái)線程的生命周期。3.1 Buffer 的核心字段與內(nèi)存使用Buffer本質(zhì)是一塊預(yù)分配內(nèi)存加上讀寫(xiě)游標(biāo)。我常用的定義大概是class Buffer { public: explicit Buffer(size_t capacity) { data_.reserve(capacity); } void Append(const char* log, size_t len) { if (len WritableBytes()) { return; // 或觸發(fā)擴(kuò)容 / 丟棄策略 } data_.insert(data_.end(), log, log len); } void Reset() { data_.clear(); } bool Empty() { return data_.empty(); } size_t WritableBytes() { return data_.capacity() - data_.size(); } const char* Data() { return data_.data(); } size_t Size() { return data_.size(); } private: std::vectorchar data_; };注意這里我用的是std::vector而不是裸指針加char[]。生產(chǎn)級(jí)日志系統(tǒng)對(duì)性能苛刻通常會(huì)直接用預(yù)分配的char[]配合size_t游標(biāo)甚至用mmap映射文件。但std::vector足夠滿(mǎn)足絕大多數(shù)業(yè)務(wù)系統(tǒng)的日志壓力而且內(nèi)存管理更安全。真正要緊的是讓 Buffer 的容量在初始化時(shí)一次定好盡量避免運(yùn)行期擴(kuò)容——擴(kuò)容可能觸發(fā)內(nèi)存搬移而且擴(kuò)容期間的操作會(huì)引入額外的不確定性。Buffer 容量取多大這個(gè)沒(méi)有標(biāo)準(zhǔn)答案。我個(gè)人的經(jīng)驗(yàn)值是單條日志平均長(zhǎng)度按 256 字節(jié)估如果 QPS 峰值為 1 萬(wàn)每秒日志量約為 2.5MB那么每塊 Buffer 設(shè)為 8MB 左右比較合適兩塊就是 16MB。日志量小的服務(wù)4MB 也已經(jīng)足夠了。內(nèi)存是便宜的資源不必太摳但也不要拍腦袋選個(gè) 1GB —— 那會(huì)讓緩存的優(yōu)勢(shì)變成內(nèi)存的壓力。3.2 BufferQueue 的交換邏輯BufferQueue是雙緩沖結(jié)構(gòu)的中樞。它內(nèi)部維護(hù)兩個(gè) Buffer 指針并在合適的時(shí)機(jī)執(zhí)行交換。class BufferQueue { public: explicit BufferQueue(size_t buffer_capacity) : buffer_capacity_(buffer_capacity), current_(new Buffer(buffer_capacity)), next_(new Buffer(buffer_capacity)) {} void Append(const char* data, size_t len) { std::lock_guardstd::mutex lock(mutex_); if (current_-WritableBytes() len) { Swap(); } current_-Append(data, len); } std::shared_ptrBuffer TakeForFlush() { std::lock_guardstd::mutex lock(mutex_); if (current_-Empty() next_-Empty()) { return nullptr; } Swap(); return std::shared_ptrBuffer swap_result_; } private: void Swap() { std::swap(current_, next_); // 這里同時(shí)喚醒消費(fèi)線程 } size_t buffer_capacity_; std::unique_ptrBuffer current_; std::unique_ptrBuffer next_; std::mutex mutex_; std::condition_variable cond_; };這段邏輯里有幾個(gè)微妙的地方第一Append時(shí)發(fā)現(xiàn)當(dāng)前緩沖區(qū)寫(xiě)不下一條日志立刻交換然后把日志寫(xiě)到新緩沖區(qū)上。這意味著next_可能已經(jīng)在積累數(shù)據(jù)了交換前它會(huì)被重置。這里有一個(gè)取舍如果next_里還有沒(méi)來(lái)得及被后臺(tái)線程刷盤(pán)的數(shù)據(jù)交換會(huì)造成日志順序錯(cuò)亂或數(shù)據(jù)覆蓋。所以更嚴(yán)謹(jǐn)?shù)膶?xiě)法是當(dāng)Append時(shí)current_寫(xiě)不下且next_非空即后臺(tái)線程還沒(méi)取走過(guò)要介入“等待消費(fèi)線程完成一次 flush”的流程。我在實(shí)現(xiàn)時(shí)通過(guò)條件變量控制保證交換發(fā)生時(shí)next_一定是已經(jīng)刷完的空 Buffer。第二條件變量的喚醒時(shí)機(jī)。最直接的邏輯是Swap()之后立刻喚醒后臺(tái)線程。但如果每次Append都喚醒日志量一高線程頻繁被喚醒上下文切換成本就上去了。我的做法是只有滿(mǎn)足“當(dāng)前緩沖區(qū)由空變?yōu)榉强铡被颉敖粨Q發(fā)生時(shí)next_中有數(shù)據(jù)”這兩個(gè)條件才喚醒。這能把線程喚醒次數(shù)與日志寫(xiě)入頻率解耦后臺(tái)線程還可以配合定時(shí)策略每 100ms 檢查一次。3.3 AsyncLogger 的對(duì)外接口設(shè)計(jì)對(duì)外接口是我的原則是極簡(jiǎn)。業(yè)務(wù)方不需要理解雙緩沖內(nèi)部機(jī)制他們只需要“初始化、寫(xiě)日志、關(guān)閉”這三個(gè)動(dòng)作。class AsyncLogger { public: static AsyncLogger* Instance(); bool Init(const LogConfig config); void Write(LogLevel level, const char* fmt, ...); void Flush(); void Shutdown(); private: AsyncLogger(); ~AsyncLogger(); void WriteToBuffer(const char* line, size_t len); void FlushThread(); std::unique_ptrBufferQueue queue_; std::thread background_thread_; std::atomicbool running_{false}; LogLevel level_{LOG_INFO}; };Init()初始化配置啟動(dòng)后臺(tái)線程Write()格式化日志寫(xiě)入 BufferQueue返回即代表日志“已受理”Flush()強(qiáng)制刷新緩沖區(qū)用于關(guān)鍵節(jié)點(diǎn)Shutdown()停止后臺(tái)線程刷完所有遺留數(shù)據(jù)安全退出Write()為什么設(shè)計(jì)成可變參數(shù)因?yàn)槲蚁M罩菊{(diào)用點(diǎn)在形式上盡可能接近原生的printf。業(yè)務(wù)側(cè)配合宏定義使用體驗(yàn)上就像寫(xiě)printf一樣自然#define LOG_DEBUG(...) AsyncLogger::Instance()-Write(LOG_DEBUG, __VA_ARGS__) #define LOG_INFO(...) AsyncLogger::Instance()-Write(LOG_INFO, __VA_ARGS__) #define LOG_ERROR(...) AsyncLogger::Instance()-Write(LOG_ERROR, __VA_ARGS__)在Write()內(nèi)部格式化日志用vsnprintf完成這是一個(gè)常見(jiàn)的性能熱區(qū)。vsnprintf本身不慢但如果每條日志都調(diào)用在超高并發(fā)場(chǎng)景下仍會(huì)占用大量 CPU。優(yōu)化的思路是把格式化拆成兩步先在生產(chǎn)線程上完成字符串拼接雙緩沖只負(fù)責(zé)搬運(yùn)已經(jīng)成型的字節(jié)流。后臺(tái)線程不能再做格式化否則格式化開(kāi)銷(xiāo)就從業(yè)務(wù)線轉(zhuǎn)移到了后臺(tái)很快會(huì)成為新的瓶頸。4. 部署與使用指南從配置到線上切換的完整流程4.1 配置項(xiàng)的選擇與建議初始化日志系統(tǒng)時(shí)我給LogConfig設(shè)計(jì)了四個(gè)最關(guān)鍵的配置項(xiàng)日志文件路徑前綴、單塊緩沖區(qū)大小、日志級(jí)別、刷新間隔。配置項(xiàng)推薦值說(shuō)明base_filename日志目錄 文件名前綴例如/var/log/app/server_buffer_capacity4MB ~ 16MB根據(jù) QPS 估算內(nèi)存緊張可降到 1MBlog_levelLOG_INFO或LOG_WARN生產(chǎn)環(huán)境不建議開(kāi) DEBUGflush_interval100ms ~ 1000ms越小日志越實(shí)時(shí)但刷盤(pán)越頻繁這里的核心原則是緩沖容量不是越大越好刷新間隔也不是越小越好。容量太大內(nèi)存里堆積的日志變多一旦崩潰丟的就多刷新間隔太小疊加的批量寫(xiě)效果被削弱。線上我常用的組合是8MB 緩沖區(qū)、200ms 刷新間隔、LOG_INFO級(jí)別。這個(gè)組合在各種服務(wù)上表現(xiàn)都比較均衡。文件切分也建議在設(shè)計(jì)時(shí)就考慮進(jìn)去。日志系統(tǒng)跑久了單個(gè)日志文件無(wú)限增長(zhǎng)是災(zāi)難。我通常會(huì)再提供兩個(gè)參數(shù)max_file_size和max_file_count。當(dāng)單文件超過(guò)max_file_size寫(xiě)入切換到下一個(gè)文件當(dāng)文件數(shù)量超過(guò)max_file_count刪除最老的文件。這樣磁盤(pán)占用能被嚴(yán)格限制在可控范圍內(nèi)。4.2 初始化到寫(xiě)日志的代碼示例以一個(gè)典型服務(wù)的主程序?yàn)槔齣nt main() { LogConfig cfg; cfg.base_filename /var/log/app/order_; cfg.buffer_capacity 8 * 1024 * 1024; // 8MB cfg.log_level LogLevel::LOG_INFO; cfg.flush_interval_ms 200; cfg.max_file_size 512 * 1024 * 1024; // 512MB滾動(dòng) cfg.max_file_count 10; if (!AsyncLogger::Instance()-Init(cfg)) { std::cerr init logger failed std::endl; return 1; } LOG_INFO(server started, enabled modules: %s, core,order,pay); // 業(yè)務(wù)邏輯... LOG_DEBUG(request%s, response%s, req_str, resp_str); // 程序退出前 AsyncLogger::Instance()-Shutdown(); return 0; }注意Shutdown()之間的業(yè)務(wù)邏輯如果存在長(zhǎng)期運(yùn)行的線程日志系統(tǒng)必須是線程安全的。我在Write()內(nèi)部用了BufferQueue::Append()上的鎖所以多線程寫(xiě)日志不會(huì)互相干擾。對(duì)于日志順序要求很高的場(chǎng)景順序僅由鎖獲取的順序決定——大多數(shù)業(yè)務(wù)場(chǎng)景不需要關(guān)心這一點(diǎn)。有個(gè)體驗(yàn)上的細(xì)節(jié)日志文件里的時(shí)間戳格式。建議輸出格式帶上精確到毫秒的時(shí)間戳、線程 ID 和日志級(jí)別。后臺(tái)服務(wù)排查問(wèn)題特別是偶發(fā)問(wèn)題缺少線程 ID 會(huì)讓上下文追蹤變得非常痛苦。格式類(lèi)似2025-01-18 14:23:45.678 [12345] INFO request accepted, traceabc1234.3 進(jìn)程優(yōu)雅退出時(shí)的日志處理進(jìn)程退出時(shí)的日志處理是最容易被忽略的坑。如果直接調(diào)用exit()后臺(tái)線程可能才格式化完一半日志進(jìn)程就沒(méi)了。正確順序是通知所有業(yè)務(wù)線程不再寫(xiě)日志或至少保證寫(xiě)日志操作已經(jīng)返回調(diào)用Shutdown()在Shutdown()內(nèi)部停止后臺(tái)刷新線程并把隊(duì)列里剩余的所有 Buffer 全部刷盤(pán)最后進(jìn)程退出為什么必須在Shutdown()里“清空所有 Buffer”因?yàn)槊r(shí)可能有兩個(gè)非空 Buffer一個(gè)是正在寫(xiě)入還沒(méi)滿(mǎn)的一個(gè)是交換后還沒(méi)被后臺(tái)線程取走的。如果只刷了當(dāng)前移交的那個(gè) Buffer另一個(gè)殘留的數(shù)據(jù)就丟了。測(cè)試中就很容易出現(xiàn)一種情況平時(shí)日志正常但進(jìn)程退出瞬間最后幾十條日志神秘失蹤根源就在這里。4.4 信號(hào)處理與崩潰保底線上服務(wù)被kill是常事。比如SIGTERM時(shí)一般會(huì)希望優(yōu)雅退出。我的做法是注冊(cè)了信號(hào)處理器在捕捉到SIGTERM和SIGINT后調(diào)用Shutdown()再退出。但對(duì)于SIGKILL和段錯(cuò)誤SIGSEGV進(jìn)程瞬間死亡任何代碼都來(lái)不及執(zhí)行此時(shí)只能依賴(lài)“日志文件最近一次 flush 之后的內(nèi)容未丟失”這一保證。有個(gè)小技巧可以降低崩潰恢復(fù)的代價(jià)日志系統(tǒng)的后臺(tái)線程每次寫(xiě)完一個(gè) Buffer就執(zhí)行一次fdatasync()或者至少是flush()而不是等到文件關(guān)閉時(shí)再刷。這樣崩潰后最多丟失的就是上一次 flush 之后的數(shù)據(jù)。代價(jià)是磁盤(pán) IO 頻率上升但換來(lái)的是日志可靠性。5. 高頻日志場(chǎng)景下最容易踩的坑和調(diào)優(yōu)路徑5.1 問(wèn)題一日志大量丟失而且丟得沒(méi)有規(guī)律很多第一次用異步日志的團(tuán)隊(duì)上線后發(fā)現(xiàn)日志有缺口第一個(gè)懷疑是磁盤(pán) IO 不夠但實(shí)際上經(jīng)常是Buffer 容量太小 生產(chǎn)速度大于消費(fèi)速度的組合。排查思路在Append()里加一個(gè)丟棄計(jì)數(shù)當(dāng)出現(xiàn)“當(dāng)前緩沖區(qū)寫(xiě)不下且next_也沒(méi)法交換”的情況時(shí)直接丟棄該條日志并累計(jì)計(jì)數(shù)。日志系統(tǒng)可以每秒打印一次這個(gè)計(jì)數(shù)到標(biāo)準(zhǔn)輸出或單獨(dú)的文件。如果丟包率持續(xù)增長(zhǎng)說(shuō)明日志量與 Buffer 容量不匹配。調(diào)優(yōu)手段有兩個(gè)方向增大單塊 Buffer 容量讓攢批的窗口更長(zhǎng)增加后臺(tái)刷新線程數(shù)量或提高刷新頻率注意方向 2 有一個(gè)副作用線程數(shù)量增加意味著刷新更頻繁可能削弱批量寫(xiě)效果。我個(gè)人的經(jīng)驗(yàn)是先嘗試把刷新間隔從 200ms 調(diào)整到 100ms如果還不夠再考慮擴(kuò)容 Buffer一般不推薦加第二個(gè)后臺(tái)線程除非數(shù)據(jù)量真的到了單線程刷盤(pán)上限。5.2 問(wèn)題二雙緩沖交換時(shí)鎖競(jìng)爭(zhēng)激烈日志線程本身成為瓶頸業(yè)務(wù)線程在調(diào)用Write()時(shí)最終都會(huì)進(jìn)入BufferQueue::Append()。當(dāng)日志量大時(shí)這把鎖就成了高頻熱點(diǎn)。雖然我的設(shè)計(jì)里鎖只保護(hù)了一次 append 加一次可能的 swap但 QPS 極高的服務(wù)依然能把這把鎖的競(jìng)爭(zhēng)壓力拉滿(mǎn)。應(yīng)對(duì)辦法有幾個(gè)按性?xún)r(jià)比排序用更精細(xì)的鎖替代std::mutex比如std::shared_mutex在日志量極高時(shí)寫(xiě)鎖其實(shí)不多只在交換的時(shí)候大部分是讀鎖。每個(gè)業(yè)務(wù)線程獨(dú)立的小 Buffer先寫(xiě)入線程本地緩沖積攢到一定閾值再合并到主雙緩沖隊(duì)列。這個(gè)方案稍微復(fù)雜但能大幅降低鎖競(jìng)爭(zhēng)。接受現(xiàn)狀只把日志級(jí)別開(kāi)關(guān)在生產(chǎn)環(huán)境關(guān)掉80% 的日志量來(lái)自 DEBUG生產(chǎn)環(huán)境把級(jí)別調(diào)到 INFO 以上絕大部分性能問(wèn)題自然消失我推薦從第 3 步開(kāi)始。很多團(tuán)隊(duì)上線時(shí)忘了關(guān) DEBUG日志量爆炸式增長(zhǎng)最后怪異步日志系統(tǒng)不行。實(shí)際上把 DEBUG 一關(guān)系統(tǒng)壓力立減 80%。5.3 問(wèn)題三日志內(nèi)容里包含二進(jìn)制、亂碼或超長(zhǎng)行日志系統(tǒng)最常見(jiàn)的使用誤區(qū)是把任意二進(jìn)制數(shù)據(jù)塞進(jìn)日志文本。比如記錄網(wǎng)絡(luò)上報(bào)文的原始字節(jié)或者記錄一個(gè)包含\n的字符串。這些數(shù)據(jù)會(huì)導(dǎo)致日志文件結(jié)構(gòu)被破壞后續(xù)按行解析時(shí)自然錯(cuò)亂。我的做法是在Write()時(shí)對(duì)非打印字符做轉(zhuǎn)義處理。尤其注意\n、\r、\0這幾個(gè)字符轉(zhuǎn)成\\n、\\r之類(lèi)的可見(jiàn)文本。如果業(yè)務(wù)確實(shí)需要記錄完整的二進(jìn)制 dump建議單獨(dú)設(shè)計(jì)一個(gè)WriteBinary()接口走十六進(jìn)制編碼再寫(xiě)文本日志而不是硬塞。另外設(shè)置單條日志的最大長(zhǎng)度。通常一條日志超過(guò) 4KB 就已經(jīng)很夸張了遇到超長(zhǎng)內(nèi)容寧可截?cái)嘁膊荒苋嗡鼡伪?Buffer。vsnprintf本身就支持傳入長(zhǎng)度上限超出部分返回的長(zhǎng)度大于實(shí)際寫(xiě)入長(zhǎng)度你可以據(jù)此判斷是否發(fā)生截?cái)嗖⒀a(bǔ)一個(gè)“日志超長(zhǎng)截?cái)唷钡臉?biāo)記。5.4 問(wèn)題四日志線程退出時(shí)隊(duì)列里還有數(shù)據(jù)沒(méi)來(lái)得及寫(xiě)這個(gè)問(wèn)題在“4.3 進(jìn)程優(yōu)雅退出”里提過(guò)。但還有一種特殊情況后臺(tái)線程在刷最后一個(gè) Buffer 時(shí)業(yè)務(wù)線程仍然在搶鎖寫(xiě)日志兩者互相等待甚至死鎖。我處理的辦法是Shutdown()先把running_原子變量置為false這樣業(yè)務(wù)線程再調(diào)用Write()時(shí)直接放棄寫(xiě)入并返回。接著后臺(tái)線程拿到隊(duì)列鎖把剩下的 Buffer 全部刷盤(pán)。這樣保證了退出路徑上沒(méi)有新的數(shù)據(jù)生成也不會(huì)卡住主程序。5.5 性能數(shù)據(jù)參考與容量估算在常見(jiàn)的高配服務(wù)器上普通 SSD 磁盤(pán)雙緩沖異步日志能實(shí)現(xiàn)百萬(wàn)級(jí)日志行每秒的寫(xiě)入能力。更保守地講和同步日志相比任何一條fprintf直接落盤(pán)的方案切換到雙緩沖異步方案后日志側(cè)性能都能提升一到兩個(gè)數(shù)量級(jí)。給一個(gè)我實(shí)際線上服務(wù)的配置參考業(yè)務(wù)HTTP 網(wǎng)關(guān)高峰期 QPS 1.2 萬(wàn)每請(qǐng)求約產(chǎn)生 8 條日志日志寫(xiě)入峰值約 10 萬(wàn)條/秒文本量約 30~40 MB/s配置雙緩沖各 16MB刷新間隔 100ms日志等級(jí) INFO實(shí)測(cè)結(jié)果業(yè)務(wù)接口 P99 耗時(shí)波動(dòng)小于 1ms日志線程 CPU 占用約 12%這組數(shù)據(jù)可以當(dāng)作一個(gè)估算基線如果你們的日志量是這個(gè)規(guī)模的 5 到 10 倍就該考慮引入多級(jí)緩沖或者直接上專(zhuān)業(yè)的日志采集框架了。5.6 快速故障排查表現(xiàn)象可能原因排查手段日志文件出現(xiàn)缺口Buffer 容量不足 / 刷新線程未跟上檢查丟棄計(jì)數(shù)擴(kuò)容 Buffer 或調(diào)短刷新間隔日志線程 CPU 過(guò)高格式化在后臺(tái)線程執(zhí)行 / 鎖競(jìng)爭(zhēng)嚴(yán)重確保格式化在生產(chǎn)線程完成關(guān) DEBUG 日志日志亂碼或錯(cuò)行二進(jìn)制數(shù)據(jù)未轉(zhuǎn)義在 Write() 中加入轉(zhuǎn)義邏輯限制單條長(zhǎng)度退出時(shí)最后日志丟失Shutdown 未清空剩余 Buffer檢查 Shutdown 實(shí)現(xiàn)確保刷完所有 Buffer日志按小時(shí)延遲刷新間隔過(guò)大 / 文件緩存未刷調(diào)小 flush_interval 或加入定時(shí) flush6. 用了一段時(shí)間之后的幾點(diǎn)體會(huì)雙緩沖日志系統(tǒng)已經(jīng)在我們這邊服務(wù)里平穩(wěn)跑了挺長(zhǎng)時(shí)間最大的感受是“日志”和“業(yè)務(wù)”終于不再互相牽扯。以前同步日志時(shí)代每次線上問(wèn)題排查都要祈禱日志別把系統(tǒng)拖慢切到異步之后日志只是安靜地把該記的記下來(lái)業(yè)務(wù)線程完全不用關(guān)心磁盤(pán)的脾氣。如果只看設(shè)計(jì)雙緩沖方案的代碼量并不大核心邏輯可能兩三百行就能寫(xiě)完。但真正值錢(qián)的不是代碼而是對(duì)邊角情況的處理。比如交換時(shí) Buffer 的狀態(tài)判斷、Shutdown 時(shí)清理隊(duì)列的邏輯、超長(zhǎng)日志的截?cái)嗯c轉(zhuǎn)義這些細(xì)節(jié)決定了系統(tǒng)在線上是否可靠。文檔里不會(huì)告訴你這些坑只有實(shí)際踩過(guò)才知道。還有一點(diǎn)個(gè)人建議日志系統(tǒng)的代碼最好保持簡(jiǎn)單、可讀、少依賴(lài)。它不像業(yè)務(wù)模塊那樣圍繞架構(gòu)演進(jìn)穩(wěn)定和可靠永遠(yuǎn)排在第一位。就算將來(lái)要升級(jí)也盡量在現(xiàn)有接口上做增量改動(dòng)而不是推倒重來(lái)。下一篇文章我會(huì)把雙緩沖隊(duì)列日志系統(tǒng)的完整實(shí)現(xiàn)代碼展開(kāi)講包括后臺(tái)線程的調(diào)度細(xì)節(jié)、文件滾動(dòng)策略的具體寫(xiě)法以及如何把日志量級(jí)擴(kuò)展到更高。如果你現(xiàn)在遇到日志性能上的問(wèn)題建議先按這篇文章的設(shè)計(jì)思路把手里的同步日志替換成異步雙緩沖版親身體會(huì)一下“日志不再拖后腿”的差別。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
插B在线观看| 欧美精品不卡一二三四在线91| 少妇一区二区三区| 国产AV高清AV无码| 狠狠亚洲| 亚洲黄片免费在线播放| 午夜福利视频在线一区| 日日摸日日弄日日拍| 看日韩美女二区三区免费操逼视频| 在线二区不卡| 精人妻无码一区二区三区伊人直播| 日韩av在线免费网站| 欧美 色 亚洲| 久久久久久九九九九九九| 调教熟妇 久久久久久| 日韩三级伊人| 亚洲色狠| 抽插亚洲无码| 青草伊人网| 亚洲城人男人的天堂| 1禁看欧美黄片免费看| 天天日夜干| 97网址97| 蜜桃狠狠色伊人亚洲综合 | 夜夜福利| 97人人爱人人做人人乐| 色五月婷婷麻豆在| 九九热在线视频| 中文字幕精品一区二区精| 天天做天天爱| 人妻天天爽天天爽三区| 欧美人妻少妇| 午夜性生活av免费在线看| 久久精品国产97欧美精品亚洲| 操b网站亚洲无码| 亚洲美女精品| 性色av一区二区| 欧美综合第一| 久操网在线| 97超碰逼| 天天操天天看| 天天综合网在线91| 殴美,日韩国产伦精品| 曰韩av中文字幕专区| 91色情黑丝搞鸡在线观看一区二区三区三州 | 亚洲小电影免费涩涩成人在线高清 | 九九九九久久久| 麻豆一区二区AV天美| a一区二区三区乱码在线| 91美女在线精品视频| 强奸乱伦亚洲第一页| 欧洲无码一区二区| 亚洲图片欧美色| 97任你吞精| 一本一道人妻久久一区二区三区 | 蜜臀网 一区| 日韩人妻免费精品| 97欧美色综合| 精品无码久久久久久国产浪潮| 婷婷丁香五月天综合东京热| 五月丁香综合啪啪| 九九九九热| 国产黄a三级三级三级av在线看| 张柏芝国产一区在线观看| 美女91在线观看| 久久超碰97中文字幕| 欧美性爱超碰97| 97婷婷色| 97人肏| 69精品久久久久中文字幕| 久草综合京东| 这里都是精品在线观看| 中文字幕日韩人妻视频| 日韩青久久| 曰本精品久久久| 国产婷婷综合在线观看| 在线视频免费播放一区| 色999亚洲人成色| 红杏大香蕉| 午夜精品久久久久久久99热影院| 后入式五六区| 五十路六十路素人熟女| 91色情黑丝搞鸡在线观看一区二区三区三州| 成人 日韩欧美一区| 日夜啪电影| 日欧毛片久久| 亚洲天天更新| 女人被添高潮免费视频| 日本男人插女人的逼黄色| 欧美韩日精品99综合| 亚洲全色网| 欧亚性爱在线视频| 中文伊人大香蕉视频| 亚洲精品欧洲精品| 最新制服中文第一页| 黄色操人| 美女露胸露奶头| 久久女同性恋一二区| 蜜臀久久99精品久久久久久婷婷| 亚洲精品啪视频| 亚洲欧洲视频小说在线观看| 2020天天色综合| 9久在线视频只有精品| 人人看人人摸人人色| 第二页中文字幕| 久久婷婷一区| 亚洲女毛多水多21P| 久久亚洲影院一区二区| 91精品婷婷国产综合久久| 翔田千里A片一区二区| 精品毛片久久久精品毛片| 日日干日日操五月天伦理视频| 深喉吞精| 99热婷婷| 国产9熟妇视频网站| 做爱A级亚欧| 夜夜高潮夜夜爽| 极品美女嘿咻| 黄片在线免费在线观看| 9精品久久| 沈阳熟女高潮对白视频| 啊啊啊用力在线观看| 欲色综合| 97香蕉碰碰人妻国产欧美| 超碰无码五月97| 亚洲图片色图欧美另类| 欧美 综合 亚洲| 思思热免费在线视频| 爆乳免费黄网站| 好吊色综合| 成人资源中文字幕在线观看天天| www欧美91| 一区二区 韩日AV| 91久久国产精品| 色婷婷五月综合激情中文字幕| 亚洲第91页| 一区不卡在线观看av| 日本蜜桃| 久久久久国产精品喷潮免费观看臀| 夜夜骑操视频| 色婷婷五月综合激情中文字幕| 日韩av电影网站| 午夜国产成人福利视频| 干少妇视频| 99热这里都是精品| .精品人妻一区二区三| 日日夜夜骚| 一区二区三区在线美女| 美日韩一二三区| 日韩一级特黄av毛片| 夜夜操一区二区| 亚卅熟女乱色| 绯色一区二区三区不卡少妇| 久久大线蕉一区| 欧美激情中文字幕另类小说| 九九九久久久W精品| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 日韩在线女优天天干| 爱妃国产亚洲视频中文字幕| 色女免费在线观看视频网址| 青青草精玖玖69精品| 永久免费发布性爱网| 97欧美色| 久久一留热品黄| 午夜福利一区二区影院| 偷拍亚洲情色| 九九久久99| 亚洲欧美一区二区三区一猛片| aV中文麻| 97视频新免费| 九九视品黄色| 亚洲色图亚洲无码强奸乱伦| 欧美色亚洲| 亚洲欧美日产国产91毛片| 国产成人亚洲精品无码古代早漏男| 加勒比av网| 久视频在线观看| 人人干人人操人人..com| 大奶的诱惑| 老司机免费视频在线91| 少妇超碰在线| 视频分类 国内精品| 国产精品黑人一区二区三区| 清纯唯美亚洲综合| 网友自拍第一页| av草草在线电影| 久久伊人网视频一区二区三区| 婷婷亚洲五月***久久| 大学生美女口爆| 激情文学小说一区二区| 久草资源在线视频官方总站日韩丝袜美腿| 日本色婷婷| 18禁免费视频| 国产精品第一区第一页| 久久久亚洲| 2020天天色综合| 成人黄页| 亚洲色图 图片| 中文字幕日产av人| 久久久草成人网站久久久草成人久久久草久久久| 国内毛片婷婷六月色| 欧美日韩*字幕一区| 无码粉嫩白虎一线天b区| Aa东京男人的天堂| 97精品网站| 美骚妇av高清在线| 天天日天天屌天天操| 蜜臀AV成人精品蜜臀AV久久| 亚洲色天堂日韩中| 四虎AV在线观看| www.婷婷| 黑丝少妇在线观看| 2010男人的天堂| www五月| 欧美乱色| 热天堂一区二区| 精品久久久无码| 天天干,天天日| 99免费在线视频| 91性高潮久久久久久久久| 亚洲成人免费中文字幕| 国语国产操逼伊人AV网| 日韩av影片在线观看| 91人妻精华帖| 2020国产精品| 男人的天堂色偷偷青青草视频婷婷网| 91丝袜美女| 黑人天8A∨高清网站| 日韩钢筋无码高清啾啾啾| 吉田爱美AV在线| 中文字幕在在线观看网站| 欧色综合| 欧美熟女丝袜| 久久久久熟女| av影片在线观看不卡| 综合久久97| 内射小黄片| 久久黄色视频一区二区三区| 激情看片网站| 亚殴在线| 99re6国产精品99re| 成人天天爽| 国产熟女一区二区| 国产成人无码a| 1人人看人人摸人人操| 国产精品无码久久久久2028| 久久激情综合| 伊人aaa| com 首页 18岁 禁区 女优 免费 精选 同城| 日产成人久久| 婷婷探花久久精品一区| 丰满熟女一区二区三区在线播放| 国产av激情无码久久天堂| 黄色AAAAAAAAAAA大片| 在线播放成人网站| 好舒服视频| 骚货操死你| 免费精品国偷自产在线在线 | 亚洲精品 大香蕉| 超碰人妻久久人妻中文97| 亚拍在线| 搡老熟女免费视频| 色婷婷九月| 蜜臀99999| 超碰吊日色| 手机午夜电影神马久久| 99精品热| 98福利在线视频| 日本女人久久久| 久操com| 射丝袜高跟鞋99| 2003天天干夜夜操| 97操| 国产无套粉嫩白浆在| 精品久久久亚洲AV成人网站| 久久99草| 国产精品盗摄 偷窥盗摄| 五月丁香狠狠爱| 亚洲综合一| 欧美色图综合| 日韩另类色图| 91成人18| 操我啊啊啊啊啊| 丰满人妻-区二区三区免费看| 欧洲欧美视频一区二区| 日韩二三区| henhen91| 丁香五月天激情综合| 久久精品国产精品| 无码最新| 欧美色图 人妻| 国产精品白领在线观看| 九九九综合精品| 精品无吗m| 717影院理论午夜伦八戒| 黄资源| 98人妻精品一区二区色欲| 五月天婷婷成人网| 精品天堂| 大香蕉天天看妹子| 久久五十路熟女人妻| 亚洲熟妇无码一区二区三区| 免费av在线播放二区| 亚洲AV乱码专区国产噜噜亚洲| 91精品老女人| 国产伦精品免编号公布| 17c嫩草51久久91嫩草| 99热官网| 欧美18老人禁| 97视频7| 无码久久亚洲高清,| 婷婷五月天补不补| 国产日韩无码一区二区三区久久区| 六六久久日韩不卡| 极品国产内射| 亚洲精品天天影视综合网 | 国产又黄又粗又猛大片 | 日本大香蕉综合网| 超碰亚洲欧美日韩无| 激情小说亚洲| 射丝袜高跟鞋99| 强奸抽插av| 日韩精品9999| AV九九| 亚洲天堂久久久久久粉红视频| 久久最新免费视频23| 久久 国产 无码| 99黄页网站| 欧美啪啪女女| 一个色导综合| av影院十区| 欧美日韩夜夜| 一区二区三区四区免费视频| 久久专区| 亚洲好色人妻| 日韩精品人妻系列无码天堂| 久久久久久久亚洲Av无码| 精品国产乱码久久久久久日本公司| 日本午夜久久电影| AⅤ片水多多| 碰人碰碰人人开房人肉| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 全球成人中文在线| 日韩中文字墓| 99热这里只有精品1| 天天综合~91入口| 巨爆乳一区二区爆乳区 | 一块操欧美| 色哟哟 日韩精品| 亚洲高清男人天堂| 久久欧洲| 2010男人的天堂| 亚洲精品国产无码高清| 九九九免费视频| 久久久精| 嗯嗯啊好大| 97av在线视频| 欧美,日韩,亚洲视频| 亚洲情色欧美| 97超碰欧美精品| 久草在| 美女露胸露奶头| 97任你吞精| 日韩操逼性鲍| 人人操人人摸人人骑| 无码人妻毛片丰满熟妇精品区| 青青草视频爽一爽| 精品精品精品| 91无码中出人妻视频| 强奸乱伦大香蕉| 激情五月天中文字幕色| 日韩三级av片| 深夜激情| 校园春色美腿丝袜 | 色九久| 99啪啪| 国内外色色色色色成人视频| 亚洲综合中文字幕有码| 日逼国产| 无码区蜜乳| 亚洲日韩电影| 大肥女高潮bbwbbwhd视频| 老鸭窝在线视频播放| 天天日天天射天天干| 五月丁香社区婷婷日韩欧美精品影院 | 超碰欧美在线欧美| 九九九影院| 日韩成人色图| 69超碰综合| 男人的天堂啪啪啪啪啪蜜桃不卡| 手机看片1025| 久久精品色欧美aⅴ一区二区| 操婢日韩| 26uuu国产亚洲综合| 欧美黑人熟妇精品91| 亚洲九九视频| 啊啊啊操死我了| 超碰到97情色| 美女黄页网站| 99精品九九九九九九| 天天欧美97| 久久有码视频| 精品美女少妇一区二区| 久久欧美激情| 色呦呦国产精品免费看| 性色AV蜜色av色欲av| 曰韩中文人妻视频| 日韩一级久久毛片| 中文字幕中文字幕一区二区| 久久精品国产亚洲AV无码做| 国产探花精品在线| 99热自拍| 六月婷婷激情| 亚洲色图20p| 综合亚洲情色| 亚洲97资源| 国产97色在线| 国产家庭乱伦性爱视频| 日韩成人高清一区二区| 日本不卡高清视频| 天天干天天狼在线视频| 亚洲色图91欧美日韩| 91久热这里只有精品| 亚洲一二三| 色噜噜狠狠色综无码久久| 亚洲图片偷拍欧美| 嗯嗯啊啊操我| 日韩人成网站在线播放| 志村玲子视频一区二区| 91色噜噜狠狠| 国产精品一区二区后入| 欧美色综合| 亚洲 日本 国产 综合| 丝袜熟女一区二区三区| 日韩精品高清资源在线| 欧亚揄拍偷拍精品视频 | 26uuu欧美日韩| 精品久久久久av影院| av凤凰久久久| 欧美日韩资源在线| 搡老女人老91二区| 欧美另类精品xxxx| 婷婷中文字幕| 少妇久久久免费| 男女国产精品| 欧美极度丰满熟妇hd| 天堂蜜桃无码视频一区二区| 1204av韩国| 欧美色图色综合| 国产一进一出视频网站| 男人的天堂亚洲| 91爱做| 97中文字幕色| 97干色天堂| 乱操乱伦AV| 色五月丁香五月| 天天射网| 蜜臀AV一区二区三区| 亚洲一曲日韩精品| 色色热| 本道在线| 中文字幕乱在线伦视频中文字幕乱码在线 | 超碰地址97| 色综合天天爱去电影网| 国产丝袜欧美在线视频| 亚洲激情网| 日本 情色 1区2区3区| 国产在线综合网| 国产一级片| 人妻内射一区二区在线视频| 隔壁邻居波多野结衣中文字幕 | 欧美五十路熟| 一区二区久久天天干狠狠| 97操综合| 色色激情五月天| 亚洲十八禁止| 18禁免费视频| 91少妇通奸网站| 北约熟女超碰| 亚洲情色在线| 欧美性夜| 国产欧美美女免费观看视频| 玖草在线视频| 蜜臀久久99精品久久综合| 亚洲国产精品无石码久久| 97av在线视频| 日日骚一区二区三区| 9久久精品| 亚洲在线A| 精品亚洲国产成人AV制服丝袜| juliaann精品熟女一区| 992大香蕉| 91狠狠综合久久久久久| 亚洲高清欧美总合| 国产精品一二三区福利| dy888午夜老子影视达达兔| 欧美熟爽综合| 两女互慰AV高潮喷水在线观看| 欧美九九99久久精品| 百度百度日本操逼| 大香蕉综合在线| 国产精品一级特黄aaa大片在线观看 | 青青草玖玖爱| 国产精品久久久久无码AV会牛| 亚洲宗合电影| 人看人人摸人人操| 快灬快灬 一下爽蜜桃在线观看| 激情综合网五月婷婷| 欧美天天弄| 肉丝网站91| 亚洲无码太久| 亚洲色图日韩丝袜制服一区二区五月在线| 精品少妇一区二区三区在线视频 | 澳门特级毛片免费观看| 99超碰网| 久久久 国产精品| 国产强奸无码乱伦| 亚洲色图欧美色图制服诱惑| 五月丁香六月婷| 最新无码国产| av橘色网站| 国产精品91一样| 91社操逼| 天堂性色| 自拍视频大全亚洲专媒视频/一区二区三区 | 精品一区二区三区四区外站| 久久久一区二区三区四曲免费听 | 91久久精品国产| 亚洲一曲日韩精品| 怡春院久久| 天天天天做夜夜夜夜做| 午夜一区| 亚洲精品国产无码高清| 天天插网| 欧美亚洲韩国视频十五区| 亚洲一区二区三区久久 亚洲一区二区| 免费看黄视频亚洲网站| 九九九九精品精| 熟女高潮合集-永久久久-成人AV| 五月丁香啪啪| 久久99人妖视频国产| 久操电影| 伦理第一页| 骚日日av| 人妻内射一区二区在线视频| 性色一线| 亚洲天堂综合AV| 在线a v| 欧亚日韩一区在线| 91制服丝袜中文字幕| 亚洲欧美日韩电影网站一区 | 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照| 一二三啪啪专区| 国产99 中文字幕日韩小视频| 国产精品美女在线一区| 91无码西班牙视频在线| 蜜臀网 一区| 欧美自拍网| 素颜老阿姨乱情色| 日han少妇无码| 久久一二三级一一一| 亚洲.欧美.丝袜.中文.综合| 久久一区二区三区入口| 伊人久久大香大香线蕉中文| 久草免费福利在线播放| 五月天我淫我色av| 黄色人人| 一级成人性爱| 欧美Aⅴ| 亚洲国产欧美一区二区潘金莲| 一起草高清无码| 精品久久久久久久| 丰满人妻aA一区二区三区| 亚洲美女精品九九视频| 亚洲欧洲日韩中文字幕一区| 天天色欧美| 欧美激情1区| 97鸡把在线视频| 色色九区| 91狠狠| 探花精品 一区二区| av网站在线看| 不卡中文字幕aⅴ在线| 激情小说日韩无码| 国产精品无码在线| 自拍大香蕉乱插| 欧美疯狂做爰xxxx| 人妻碰碰碰碰碰碰| 色爱综合网欧美| 亚洲大色堂| 午夜精品久久久久久久99| 欧美综合亚洲| 丰满人妻一区二区三区免费| 欧美gv在线观看| 国产日韩在线播放av| 国产精品色片一区二区| 五月天激情婷婷| 四虎AV无码| 日韩精品9999| 人妻少妇精品久久久久久| 成人小电影网站tex| 日本一区二区中文字幕久久| 一级特黄aaa大片在线观看成人一级片在线观看 | 香蕉欧美| 天天色天天干天天射| 欧美性爱一级操| 日韩AV电影网站| 禁十八久久| 色97综合中文字幕| 精品免费视频国产一区| 久久成人午夜精品影院| 99综合| 麻豆伊人网| 精品丰满熟妇人妻一区| 色五月AV| 国产一级不卡在线观看| 狠狠五月天| 成人欧美日超碰| 人人妻人人爽一区二区三区| 久热精品在线国产| 欧美亚洲日韩人妻在线观看| 好吊色一区| 欧美瑟综合| 黄片视频,下载| 久久精彩免费视频| 久久久久9| 欧美成年人性爱视频免费观看| 日韩性爱免费视频在线网站| 97香焦色区| 舔舔啊| 国产福利一区二| 在线日韩视频| 国产免费一区| A级片日韩欧美国产欧美视频精选观看| 亚洲日韩精品在线播放| 超碰97玖玖爱| 91东北熟女| 婷婷中文字幕| 色婷婷一区二区三区久久午夜 | 淫荡网址| 欧美躁死她一区二区| 蜜臀一二三| 亚洲本色精品一区二区久久| 丁香五月婷婷基地| 呻吟 欧美 日本 中出| 91人妻人人澡人人爽人人精品| 丁香六月综合激情| 欧美人妻熟女在线| 欧美疯狂做爰xxxx| 综合网97| 青草草免费网站av| 亚州色图欧美| 精品国产一区二区三区在线播出| 人人天天欧洲| 96精品久久久久久久久久| 色情五月综合婷婷| 国产欧美另类久久久精品课程| 啪啪资源网| 亚洲中文电影| 欧美人妻久久精品二区三区| 蜜臀久久在线视频| 黄色免费网| 91+欧美| 欧美色图综合| 91精品久久久久久77777| 亚洲乱熟女一区二区| 色情乱伦AV| 蜜臀va69| 99操| 91亚洲人| 校园春色欧美色图| 日熟女| 98精品国产乱码久久久久久| 日本性爱不卡视频| 五十路人妻在线| 久干9操| 丝袜美腿丝袜| 看日韩美女二区三区免费操逼视频 | 一区二区日韩欧美久久| 啊啊啊好想要| 久久av色| 嗯啊抽插大香蕉网页| 97 国产精品| 狠狠狠狠狠狠| AV天堂因数| 亚洲少妇诱惑| 狼狼色丁香久久婷婷综合五月| 91老熟女91老女人| 日本一级一级一级一级| 青草成人免费视频一COm| 天天综合香 ld视频| 日本一区视频在线观看| 91殴美大片| 97任你吞精| 日本熟妇人妻一区二区三区| 久久久久久久久九九久孕交| 国产亚洲精品美女久久久| 久久成人午夜狠狠| 日韩pv中文| 九九精品无码专区免费| 超碰色美女| 欧美日韩国产中文超碰| 日韩性爱人人爱人人操| 亚洲天堂2020| 伊人 俄罗斯 a v| 亚洲国产精品无码AV在线| 91五十路| 欧美天堂亚洲电影院一区在线播放| 色色色欧美| 日欧操屄| 国产精品农村妇女精品| 免费网站观看www在线观| 性爱精品一区| 中文字幕一区二区日韩网| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 男人的天堂不卡一区二区| 欧美岛国精品在线观看| 精品无码产区一区二| 骚乳在线| 欧美做爰无码A片视频| 少妇久久久| 呻吟 欧美 日本 中出| 91女网站| 欧美性天天影视| 少妇高潮对白在线观看| 上特色A在线| 日韩有码回春沙龙第一页| 九九玖玖精品| 久超碰在| 丰满的三级少妇欧美久久久| 国产理论视频在线播放| 日韩成年人性爱视频| 91色射| 男人天堂网手机版婷婷| 国产久久一区二区三区野外在线| 黑丝内射一区二区三区| 免费看欧美美女黄色大片| AA级电影三区| 成人a v在线播放免费| 久久精品超碰| 国产综合久久久麻桃个| 干美女人妻| 成熟熟女国产精品一区二区| 欧美日韩精品国产91| 九九久久久九九| 天天影视网综合少妇| 国产又粗又长又爽又色| 人人操人人插人人摸人人干| 午夜国产乱伦视频| 久久透逼视频| 26uuu性物| 男女激烈网站最新| 欧美αv.com| 综合国产影视三级| www久久国产精品| 亚洲日韩视频二区| 欧美A片中文字幕| 91九色蝌蚪在线观看| 色视频蜜乳| 日韩一区二区精彩视频| 久久黄片国产一区二区| 欧 美 自 拍 偷 拍| 日韩亚洲中文有码视频| 95自拍视频在线观看| 欧美顶级黄色大片免费| 精品亚洲黄色片 国产精品导航一区二区 | 老司机午夜福利视频一区二区| 又摸又舔在线观看网站| 碰超人人在线一区二区三区| 亚洲 另类 丝袜 自拍 动漫| 青青草一区二区三区四| 亚洲交换| 国产精品日日摸天天碰| 国产乱伦视频污| 日韩精品字幕| 亚洲av无线观看| 性做久久久久久免费观看软件| 欧美日韩丝袜| 春色校园综合网| 嗯嗯啊啊好疼| 国产白丝网站| 97国产精品| 中文字幕亚洲热播人妻| 成人性爱电影一区二区| 91狠婷| 欧美综合制服在线| 91美女視頻| 热99re69精品8在线播放| 日韩中文字墓| 日韩精品在线观看网站| 91精品黄在线观看| 美女裸体麻豆天美蜜桃91| 91国产美女丝袜足交精品视频 | 精品妇操一区二区三区| 啊啊啊好舒服视频| 无码久久国产 | 九九精品美女高溯喷水| 国产精品熟女九九九| 超碰97国产欧美| 最新亚洲黄色免费电影| 新版天堂中文资源8在线| 操久久久久久| 中文字幕AV片| 久久97| 国产熟女乱论| 五月天伊人| www.av不卡中文字幕| 日韩欧美性吧婷婷乱伦大香蕉 | 影音先锋国产精品| 国产污视频麻豆传媒一区二区| 日日妻色网| 97精品97久久| 黄色片A级一区二区三区| 日本性爱不卡视频| 黑人天8A∨高清网站| 骚鸭AV| 天堂无码精品国产久| 亚州情色j区| 女人18精品一区二区三区| av网站免费线看| 色丁香五月婷婷| 69久久久久久久久久久久久| 九九九色| 欧美99| 欧美天天综合站| 三级日本一区二区三区| 亚洲精品视频在线| 日本高清一本二本免费不卡| 亚洲av综合伊人久久| 色五月婷婷在线| 97操97干| 美中日韩无码| 色综合99999| 欧美一级黄色免费专区| 久久久久久久久久久人妻| 91痴汉| 91人妻尻屄视频| 蜜臀99999| 色操逼网| 久久久久久性爱视频| 美女t无毒不卡不卡| 96久久精品一二三区色欲| 艳尻美人妻| 国产视频一区二区三区在线免费观看 | 性做久久久久久久| 亚洲丝袜99| 色色网91| 欧洲精品网| 麻豆国产视频精品观看| 人人超碰在线观看黄| 亚洲欧美日韩免费观看| 人人爱夜夜爱| AVE乱伦| 1二区9| 日韩精品一区二区高清| 打av高清| 色欲Av人妻精品一区二| 久久久久久久久久久97| 超碰免费人妻人人| 综合激情97 | juliaann丝袜大战黑鬼| 熟女五十路一区二区三| 超碰这里只有精品| 国产99久久99热这里只有精品15| 少妇内射www在线观看视频| 亚洲欧综合另类无码一区| 中国的操老妇女| 欧美一区二区三区四区综合| 九九九精品一区二区无码| 福利操逼| av橘色网站| 婷婷五月天小说| 日本成熟少妇A∨网站| 观看视频图片一区二区三区| 亚洲av国产av综合av卡| 91爰爱欧美| 国产树林里野战在线看| 992大香蕉| 97香蕉人人乳| 国产无马视频| 国产精品农村妇女| 麻豆2区1区天美| 欧美成人A天堂片在线观看| 亚洲人码13| 92人人操人人| 青青久久艹| 日本特黄f c2| 国产不卡免费在线视频| 一区二区三区四区在线不卡| 大香蕉色十月| 国产乱伦亚洲| 女优大全 - 91n| 蜜桃臀 后入 一区 二区 三区 在线| 不卡一区二区日本视频| 99热线麻豆 | 天天肏美女| 国产日韩在线播放av| 欧美自拍网| 亚洲s在线观看| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 色99在线| 少妇3P性爱自拍| 中文字幕AV中出| 国产精品丝袜久久亚洲不卡| 97人人操人人干| 欧美日韩国产黄色片| 78精品| 久久一本大香蕉 | 亚洲天堂资源在线| 色在线69堂| 亚洲成人av色网| 欧美疯狂做爰xxxx| 三级日韩一区二区三区| 国产成人精品网站| 欧美日韩青操| 97久久精品国产| www.婷婷五月天| 黄片aaaaa一区| yw尤物av无码点击进入麻豆| 精品1区2区3区| 日本九九久久99| 九九热超碰97亚洲最新香蕉 | 黄色高清无码无码破解免费暗网| 精品人妻1区| 亚州男人天堂| 91高清欧美| a人片中文字幕一区二区| 国产农村妇女精品一| 综合激情婷婷| 久久久久国产无av| 最新岛国大片| 樱花蜜乳av| 欧美v日韩v亚洲v最新在线| 2017天天插| 欧美激情一| 蜜乳av一区二区三区| 中文字幕人妻色偷偷久久皮| 美女高潮视频91| 色欧美天天| 欧美后进式| 第一高清av中文字幕| 尤物一级在线免费观看| 在线播放一级无码视频| 欧美精品一区二区少妇免费A片| 97精| 中文字幕在线免费观看2| 欧美劲爆第一页| 丰满人妻-区二区三区免费看| 超碰伊人在线| 亚洲少妇免费视频\| 欧美91网站| 天天爱综合网| 风骚少妇视频中文字幕| 日韩人妻精品| 九9热伊人| 日本在线15p| 日韩综合色网| 国内一级精品| 九九热av| 亚洲 欧美 精品专区 极品| 婷婷涩嫩草鲁丝久久午夜精品| 97精品网| 亚洲国产精品无码AV久久| 欧美 精品国产制服第一页| 中文字幕三四区| 強姦亂倫a| 国产多人在线观看视频| 一牛影视成人片免费| 国产精品嫩草影院免费| 抽插无码高清一区| 18禁免费视频| 日韩午夜啪啪视频| 91ise欧美| 九九九九88| 日韩中文字幕宗合在线| 国产自产22区| 色97干| 久久伊人最新网址视频| 亚洲欧洲综合成人av一区| 亚洲AV无线| 超碰在线91| 亚州少妇| 伦理弟一页| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 蜜臀一二三| 夜夜夜夜久久久久| 亚洲欧美人妻| 成人美女av| 国产又色又爽又舒服的三级视频| 高凊专区人人操| 日日黄色三级网站| 九九九九热只有精品| 啊啊啊啊操死我| 国产精品人妻熟女aⅴ| 欧美性爱系列| 国产精品午夜成人福利| 色诱avtt| 久久99九九九九6666免费观看软件| 香伊人在线| 黄色AAAAA欧美| 久操热| 久久日韩毛| 色老牛| 国产精品另类一区大香蕉| 少妇一区二区三区| 日韩中文字幕视频| 国产热RE99久久6国产精品首| 夜夜爽77777| 亚洲人精品午夜不卡| 欧美综合综合| 亚洲精美粉嫩嫩泬在线观看 | 91精品人妻一区二区三区蜜桃| 人人艹亚洲| 五月婷婷六月色| 欧美第二页午夜| 极品白嫩美少妇在地板上位骑射淫水泛滥| 日韩人妻播放| 97亚洲国产影视| 精品人妻一区二区三区四区| 欧美经典一区二区三区 | 亚洲熟久久| 亚洲欧美国产中文视频| 亚洲 综合 欧美| 亚洲色图第四色| 人人看人人爰人人操 | 精品久| 中文字幕123| 亚洲欧洲色情高清| 久久春色| 中日高清无码操逼视频| 亚洲国产亚洲天堂| 岛国免费视频在线| 国产精品国产自产拍高清AV| 偷拍新久久| 青娱乐久久艹| 午夜欧美神马久久久久| 人妻性爱一区二区| 亚洲伊人久久精品狠狠在线| 大逼色网站| 国产伦精品一区二区三区在线观 | 欧美亚洲美少妇一区二区| 最新无码国产| 久久极品伊人| 欧美色乱| 五月丁香六月激情综合| 99最新日韩偷拍视频| 亚洲欧美日韩精品久| 麻豆国产第一| 国产无马视频| 色 亚洲 91| 萌白酱自拍视频| 老师充足的奶水小说| 搡老女人老91妇女老熟女| 中文字幕av色| 熟女人妻一区二区三区免费看 | 啊a一区在线| 少妇精品久久| 99久久久无码| 超碰在线看| 日韩一区二区三区四区五区| 一起草日韩| 啪啪91| 亚洲天天综合| 91粉芽高清在线一区二区| 综合色区偷拍| 国产亚洲精品自在线亚洲情侣 | 中文字幕蜜乳av| 亚洲男人天堂Av| 精品综合久久久久久五月天| 骚货| 日韩欧洲操屄视频| 亚洲精品骚逼| 国产91精品福利在线| 东京热不卡视频| 亚洲精品亚洲人成人网| 97日韩| 国产日本熟女顶级一区二区三区视频| 色在线视频导航| 丁香婷婷激情五月天无毒不卡| www.大香| 99999久久精| 女同亚洲欧美一二三区久久电影| 日韩啊V| 啊好爽快点-国产一区二区三区撒尿在线-成人AV | 韩国一区二区精品亚洲| 亚洲熟女av中文字幕| 四虎884a| 成人乱码一区二区三少妇| 97超碰欧美精品| 97视频620| 亚洲色图欧美视频| 国产白丝精品在线观看| 国产SV一线| 蜜臀AV网站| 黄色工厂这里只有精品| 大香蕉色十月| 深夜国产一区二区三区在线看| 四虎免费视频| 综合国产97| 草草草视频在线免费看| 欧美成人精品一区二区男人蜜臀| 婷婷香蕉欧美在线一区二区三区| 国产欧美日本亚洲精品| 亚欧美无遮挡| 色丁香五月婷婷| 欧美日韩亚洲一区二区在线观看| 欧美se综合| 91网18| 丝袜AV一二三区| a片 xxxx受爽视频| 骚人妻少妇视频| 亚殴在线| 丝袜美腿制服人妻二区中文字幕| 精品无码久久久久久久久果冻糖心| 偷拍综合亚洲| 口爆综合网| 欧美黄片视频在线观看免费 | 五月婷婷啪啪| 日韩欧美午夜视频在线| 天天综合欧美| 亚洲精品蜜桃久久久| 超碰AV在线| 新婚人妻扶着粗大强行坐下| 被窝影院午夜看片无码| 99热在线只有精品| 欧美91久久久久| 超碰中文字幕人妻草一区| 99久热| 国产成人无码网站在线视频| 亚洲麻豆av一区二区| 一起草在线视频| 久久久久久久| 97超碰免费生活| 日欧毛片久久| 刺激精品视频| http://qxhbdz.com| 色色亚洲| 国产精品女生av| gogogo免费高清看中国国语| 熟妇视频一区二区三区在线观看| 欧美性爱中文字幕无线码| 另类小说综合网| 超碰97欧美| 久久久亚洲| 91欧美亚洲| 亚洲自拍小说| 亚洲色图8| 欧美性综合| 精品国产99| 亚洲中文字幕日产无码久久| 狠狠狠一区二区三区| 精品国产嫩穴视频| 欧美日韩情色一区二区| 狠狠干综合| 加勒比无码一区二区三区| 中文字幕高清20页视频| 日韩精品一区的| 亚洲综合五月天| 日本天天吊| 亚洲天天艹|