日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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)只是一行字符串但這條字符串從用戶態(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ě)壓力瞬間拉滿接口平均耗時(shí)從 2ms 漲到了 40ms最夸張的時(shí)候業(yè)務(wù)線程被日志卡的連心跳包都發(fā)不出去。后來(lái)把策略改成“攢一批再寫(xiě)”問(wèn)題才算緩解。這就是異步日志的核心思路把日志寫(xiě)入從業(yè)務(wù)線程上搬走交給專門(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ě)入日志稱為“待寫(xiě)緩沖區(qū)”或“當(dāng)前緩沖區(qū)”另一份被后臺(tái)線程用來(lái)讀取并刷入磁盤(pán)稱為“待刷緩沖區(qū)”。當(dāng)“當(dāng)前緩沖區(qū)”寫(xiě)滿了或者到了固定時(shí)間系統(tǒng)會(huì)執(zhí)行一次緩沖區(qū)交換swap把業(yè)務(wù)線程寫(xiě)滿的這塊換成后臺(tái)線程手里的那塊。交換之后業(yè)務(wù)線程繼續(xù)往新?lián)Q來(lái)的空緩沖區(qū)里寫(xiě)后臺(tái)線程則拿著裝滿日志的緩沖區(qū)去刷磁盤(pán)。圖景大概是這樣業(yè)務(wù)線程 后臺(tái)線程 | | | 寫(xiě)入Buffer A | |-------------| | Buffer A滿 | | 交換 | |-------------| | 寫(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ě)滿”的內(nèi)存刷完一塊就換一塊完全不阻塞業(yè)務(wù)線程。兩者之間只有一次極短的交換操作需要同步。2.2 為什么是“雙”緩沖而不是單緩沖或多緩沖單緩沖的方案看起來(lái)也能用一塊緩沖區(qū)寫(xiě)滿了就刷盤(pán)刷盤(pán)期間業(yè)務(wù)線程等著。但問(wèn)題在于“寫(xiě)滿后刷盤(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ě)滿一塊就換下一塊后臺(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ū)未滿就定時(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ě)滿-交換-刷盤(pán)-再寫(xiě)滿”的循環(huán)表現(xiàn)為磁盤(pán)持續(xù)高負(fù)載系統(tǒng)整體性能下降。此時(shí)不能無(wú)限等下去常見(jiàn)策略是當(dāng)兩緩沖都占滿且后臺(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足夠滿足絕大多數(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都喚醒日志量一高線程頻繁被喚醒上下文切換成本就上去了。我的做法是只有滿足“當(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)銷就從業(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ì)讓上下文追蹤變得非常痛苦。格式類似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)滿的一個(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í)只能依賴“日志文件最近一次 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)壓力拉滿。應(yīng)對(duì)辦法有幾個(gè)按性價(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之類的可見(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í)緩沖或者直接上專業(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ě)完。但真正值錢的不是代碼而是對(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)單、可讀、少依賴。它不像業(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
返回資訊列表
97硬碰| 小日子操bb在线看| 亚洲色 国产 欧美 日韩| 婷婷激情五月| 亚洲丝袜在线观看| 色婷婷五月综合激情中文字幕| 欧美亚综合色图| 欧洲亚洲少妇| 亚洲综合113页| 夜夜夜夜久久久久| 婷婷五月天小说| 成人草草视频| 久久人妻视频网| 国产深夜福利| 青青11操操操操操操操操| 亚洲色图 91| 国产AV高清AV无码| av天堂加勒比| 青青草操逼逼视频| 亚州一区二区| 久久最新视频免费观看| 五月天婷精品激情| 精品无人区麻豆乱码1区2区图片| 天天综合~91入口| 上特色A在线| 97亚洲一区| 思思视频免费看网站| 情色av电影| 国产美女口爆吞精视频| 久操在97| 日本道久久综合色色| 四虎影视国产精品| 69人妻精品一区二区绯色| 熟女人妻一区二区三区| 天天天天做夜夜夜夜做| 秋霞蝌科网日本一区| 欧美洲精品一级| 久综合网| 中文字幕精品探花视频| 人澡逼| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 亚洲美女精品九九视频| 国产性爱欧美性爱在线| 色小视频蜜乳| 牛牛AV人人夜夜澡人人爽| 91人妻丝袜无码| 91色黑人少妇| 999亚洲国产视频| 一区二区播放| 熟妇人妻一区二区三区| 日本午夜福利影院| 亚洲网站一区二区在线| 伊人久大| 久久久网一区| 五月激情在线| 99视频精品| 国产精品白领在线观看 | 99国产精品在线观看| 国产三级资源在线观看| 国产蜜臀精品一区二区尤物| 97露脸精品丝袜| 久久精品国产免费观看99| 97视频在线播放| 97AV在线免费观看| 精品无码一区二区| 综合欧美日本三级| 国产精品日韩在线一区| 精品国产乱码久久久久久影片| 美日韩男女操屄视频| 丰满欧美放荡少妇在线| 日日黄色三级网站| 91在线欧色| 久久五月天婷婷| 亚欧性爱无码| a天堂视频| 蜜臀久久99精品久久久| 一区二区视频在看| 九九九偷拍| 天天看片麻豆| 久久久久元码视频| 性生活无遮挡纯毛片在线看| 嗯嗯嗯啊啊啊在线免费观看| 台湾佬中文娱乐自偷自拍| 久久这里只精品99re66图| 91午夜无码| 一中国女人毛片水真多| 澳门黄片一香蕉视频| 怡红院成人视频| 天天热精品| 欧美激情久| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 日本2020一区二区| 色综合 加勒比| 精品十三区| 色精品极品| 熟女人妻一区二区三区| 国产精品人妻熟女aⅴ| 日韩欧美加勒比| 亚洲综合色图欧美| 999久久芭蕾| 大干人妻| 欧美色图自拍| 天天搞欧美| 熟妇人妻一区二区三在线 | 黄人人操人人操| 一级性爱网| 欧美亚洲高清| 91P0RNY大屁股人妻| 淫荡网址| 国产精品麻豆免费视频| 9国产超碰| 国产亚洲色停停久久99精品91| 国产精品久久泡妞网站| 蜜臀久久99精品久久久电影| 97国产人人| 秋霞怕怕片| 蜜臀99久久| 97超碰站| 成人a级高清视频在线观看| 性久久久| 欧美系列在线一区二区| 国产在线视视频有精品| 成人五月香网在线| 91中文精品日韩欧美在线| 自拍视频大全亚洲专媒视频/一区二区三区 | 七久久久| 夜夜高潮夜夜爽高清视频一 | 色爱综合网| 欧美亚洲综合色| 熟妇最新先锋一二三区| 欧美色日| 精品久久久久综合无码| 欧美精品久久96人妻无码| 大屁股人妻女教师撅着屁股| 日韩免费性爱视频在线观看| 艹我哪美一区无码| 欧美不卡二区| 精品国产精品一区二区| 亚洲美女30b| 国产AV天美传媒一区二区三区 | 午夜福利视频在线一区| 亚码激情| 精吧天堂| 内射小黄片| 郑州宾馆老熟女露脸啪啪| 亚洲Av无码成人精品国产| 水野优香在线观看| 高清肉丝中文无码| 亚洲激情视频| 国产成人免费观看在线视频| 艹我哪美一区无码| 91女优在线观看| 精品九九| 色婷婷网| 色九九九九九九| 亚洲AV成人精品网站在AV| 国产精品一级特黄aaa大片在线观看| 中文字幕亚洲在线一区| 白丝AV网站| 91女优在线观看 | 亚洲人成网站7777| 中文久久爆乳| 9久精品视频在线观看| 久久久女人| 国产一区自拍欧美日韩| 天综合网| 亚洲国产日韩欧美熟妇在线| 使劲用力艹少妇视频一区二区| 清纯唯美综合| 欧美亚洲日本视频久久久 | 欧美日韩性爱操大逼| AV色天香在线| 综合97| 免费操逼视频下载| 爱爱久久| 日本国产亚洲一区在线观看| 天天日老熟妇| 亚洲毛片久久| 黄色一级视| 美女AV一区二区| 欲香欲色| 亚洲 se图 欧美电影| 午夜在线播放| 色官网在线| 日韩一级二级三级免费看完整版国语版| 人人妻人人爽| 人妻熟女一区在| 男人天堂毛片| 美女被艹尤物视频| av橘色网站| 男女激情黄色网址| 国产欧洲精品亚洲午夜拍精品| 亚洲欧洲av影音| 五月天色五月| 日本一道在线播放高清| 综合亚洲情色| 国产亚洲日韩欧| 97一区二压| 无码137片内射在线影院| 超碰人人乐97| 中日韩免费看男女操逼大全| 超碰1024久久| 四虎国产精品永久地址入口| 97超碰在线资源网站| 中文字幕,人妻,日韩| 99xav| 午夜福利国产欧美日韩夜夜| 亚洲另类色图片| 日韩性爱小视频| 亚洲综合在线高清| 91影库| 男人的天堂在线| 一区二区三区免费岛国片| 亚洲色资源| 国产精品干干干| 九一国产精品| 婷婷六月色| 人人模人人看| 欧美激色| www.婷婷六月天| 9久久精品| 久九干| AV一区观看| 国产精品久久久999| 在线观看黄色电话| 好吊色综合| 影音综合网| 久草视频在线视频在线视频在线观看 | 亚洲欧美国产其他二区| 91第一页| 亚洲欧洲无码97久久精品| 国产精品久久久久久久黄无码| 黄页网站成人免费| 超AV色女| 插日本熟女视频| 超碰在线一区二区三区| 亚洲天堂人人妻| 国产情侣自拍在线播放| 13小男生GAY自慰脱裤子| 狠狠做深爱婷婷久久二区| 久久99久久99精品天美传媒棢·纸:. | 久久黄色视频一区二区三区| 老司机香蕉久久久久| 大香蕉欧美伊| 99久久久久| 日韩欧洲操屄视频| 午夜舔阴达高潮视频免费看| 人妻天天爽夜夜爽2| 2011国产精品| 激情五月天社区| 国产乱伦视频污| 日韩专区久久久| 亚洲AV资源| 国产精品视频精品一二| 久久久免费的精品| 午夜福利1区2区3区| 亚洲深夜福利| 日本超碰色精品| 高潮内射在线| 日本综合久久| 奇米狠999| 中文字幕美女91| 欧美日韩狠狠爱| 伊人 俄罗斯 a v| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 国产风韵犹存熟妇三区| av大香蕉网站| AV天堂丝袜| 巨爆乳肉感一区二区三区竹菊影视| 香蕉视频欧美一卡二卡| 国产又粗又长又大的视频| 99精品热| 人人摸人人添人人操 | 色亚洲欧美| 久久av网| 无码一区二区三区四区五区六区七区八区九区十区视频 | 免费草草草草草视频| 日韩情色视频| 9久久精品| 高清无码 国产精品| 五月天亚洲色图| 蜜臀99久久国产| 狠狠爱AV| 亚洲日韩熟女人妻高清在线| 97超碰久久色| 国产亚洲欧洲在线观看| 国产丝袜美女诱惑| 麻豆久久久一区二区| 一级A片女人高潮叫床| 色在线综合| 亚洲欧美综合| 亚洲情色综合| 欧美日韩大香蕉| 久久久97| 国产高清自拍视频| 99久国产精品午夜性色福利| av毛片aaaaa免费看| 中文字幕丰满子伦无码专区在线视频最新 | 九九综合久久| 免费看欧美美女黄色大片 | se吧提供国产乱老熟视频胖女人 | 久久久久久久综合,国产| 超碰1024久久| 亚洲综合情色| 日韩欧美久久婷婷网站| 日本不卡二三区| 91性高| 99啪啪| 中文字幕88av在线| 75大香蕉| 久久綜合很很很| 裸体美女久久久| 97超级欧美| 综合天天网| 闷骚老熟女15P| 熟妇人妻一区二区| 神马午夜久久久| 九九夜精品九九在线| 国产精品久久发布| 九九九九免费视频| 9.1小视频| 玖玖综合视频| 午夜在线播放| 精品无码一区二区三区| 欧美性爱中文字幕无线码| 日欧亚洲二三区大片不卡| 日韩欧美综合激情| 一级日本牲交大片好爽在线看| 97aiaiai| 日韩欧美经典在线观看| 97干在线看| 超碰97最新人妻| 精品女同一区| 性色AV蜜色av色欲av| 欧美Aⅴ| 99精品久久久久久久婷婷| 日本精品一区二区中文字幕| 99在线免费视频| 国精综合一二三区影视| 夜夜春夜夜操| 熟女激情综合网| 黄页视频网站野外| 激情小说五月天| 日韩影片中文字幕一区二区三区| 都市激情人妻一区二区青青操视频| 亚洲激情深爱文学小说网站| 久久久久九九九九| 99ri精品| 97免费视频网| 极品色综合| 国产精品久久久久久亚洲色欲| 静品嫩模一区二区| 久久综合中文国产| 精品国产乱码久久久影院| 91天天| 久久久久亚洲av综合波多野制衣| 免费观看欧美日韩操逼视频| 超碰98综合网| 91亚州| 十八禁视频网站| 性性久久| 久久精品人妻一区| 五月丁香| 亚洲综合情色| 日韩操p| 中文字幕 码 自拍 视频 区| 亚洲男人的天堂网| 亚洲黄色视频在线观看视频| 天美av在线观看| 亚洲中文sv| 中文字幕一区二区日韩网| 亚洲s在线观看| 五十路成人在线视频二区三区| 一区二区三区亚洲| 亚洲欧美天堂在线| 五十路熟女人妻一区二区在线观看| 欧美亚洲日本视频久久久| 白丝1区2区3区| 中文字幕一区二区三区人妻不卡| 久操网址| 午夜后入| 日韩三A大片在线观看| 东北夫妻性偷拍| 九九九国产精品| 欧美色视频在线| 小草av不卡亚洲二区| 人人模人人看| 九九精品美女高溯喷水| 国产剧情在线| 四虎 精品 WWW| 妇女一区二区三区| 久久久久久久一级黄色打同平台| 97综合激情| 极品白嫩美女白浆成人福利在线看| 97在线青| 亚洲字幕一区二区| 午夜福利在线视频1000| 国产在线观看91精品一区| 日本一天色道久久久精品视频| dy888午夜老子影视达达兔| 超碰av在线| 好涩综合| 三上制服丝AV| 日婷婷| 亚洲成人精品久久久| 日韩av在线精品观看| 99热网站| 少妇久久久久久| 按摩中文字幕| 天天色天天干天天爱| 少妇同性| 精品性爱一二三区| 97在线免费公开视频| 亚洲高清在线| 日本精品一区二区不卡| 桃色六月天| 亚洲成人在线高清| 久湿久久| 色色色网站| 9色国产精品一区粉嫩| 亚洲最大的黄色电影网站。| 日韩人妻制服丝袜av| WWW美腿丝袜香蕉中文| 国产精品久久久久无码A√| 春色综合免费| 天天插天天插| 美国一区二区三区视频| 97chaopenrihan| 亚洲成人av色网| 少妇一级无码精品| 天天操天天日青青草超碰av| 五月丁香啪| 超碰在线欧美性爱激情| 午夜精品久久久久久久99| 91久热| 97色碰| 久久综合av| 大香蕉九九| 久久久久久电影| 色色九区| 亚洲熟女一区| 日韩伦理视频| 秋霞一级视频在线观看免费| WWW.操逼.COM| 久久精品日韩专区免费观看| 天天舔九色婷婷| av资源在线播放天堂| 日本一区不卡| 国模91| 麻豆性爱视频在线播放| 动漫爆乳3D奶水一区在线观看| 麻豆AV一区二区天美传媒| n1038 一二三区| 日本岛国黄色网址| 国产A v无码专区| 91宗合网| 9997se| yy少妇精品久久| 亚洲一区二区麻豆影院| 亚洲中文日韩精品| 国产精品蜜臀久久久久无码AV| 国产精品高潮久久AV| 色色色热| 国产一级黄色片在线观看| 婷婷干黄色| 日韩有码中文字幕女同性恋| 人妻色情天天操| 伊人网av| 综合网欧美在线| 人、人、摸,人、人、草| 国产成人拍国产亚洲精品| 91白嫩| 久肏视频字幕| 黄色十八禁| 蜜臀99999| 日韩欧美成人大香蕉| 五月激情小说| 欧美精品日韩一区二区| 一类无码操逼视频| 久久久久人妻二区精品叶可怜| 超碰成人人人爽人人爽| 青青久久艹| 欧美桃色网| 日日夜夜国产综合| 久久黄色性爱视频| 亚洲啪啪视频免费| AV一起草在线| 日韩成人在线性爱视频| 高清无码久操视频| 操逼日批| 久热在线精品免费观看| 手机在线中文字幕国产| 久久五十路熟女人妻| 很很操在线| 亚洲乱码精品一区二区| 欧美性生活男人的天堂| 日本国产亚洲一区在线观看| 9丨亚洲一区二区在线| 无码动漫av中文字幕| 热思思免费视频| 国产强奸乱伦无码视频| 天天爽夜夜爽夜夜爽精| 一线黄色免费性爱片| 黄片视频,下载| 99这里只有精品国产| 日韩激情啪啪啪| 久久久久亚洲AV无码专区少妇| 日婷婷| 国产多人在线观看视频| 亚欧成人综合影院| 福利伊人玖玖国产| 天天干人妇| 91视频国品一二三区| 夜夜操91744565| 台湾肥佬网一区二区三区| 天天综合网91入口| 日韩三级性| 性欧美第一页| 91亚洲网| 亚洲国产美女久久久久| 亚洲AV噜噜狠狠网址蜜桃动漫| 国产人妖视频一区在线观看| 99久久久久| 91人妻丝袜无码| 亚洲 日本 国产 综合| 亚洲AV成人无码一区二区三区在线观看 | 欧美在线大香蕉| 日本免费一级AAA大片器 | 久久的免费性爱视频| 韩国女主播青草在线| 日韩天美| 中文字幕一区二区视频在线观看 | 午夜精品人妻二区三区| 国产剧情AV不卡在线观看| 99青草| 久久久国产精品亚洲精品| 亚洲精品黄码久久久久| 国产福利精品98视频| 亚洲精品日日夜夜52| 精品午夜福利国产一区二区在线观看| 男人天堂一区二区| 色翁荡息又大又硬又粗又爽| 婷婷国产精品九区| 亚洲伊人a线观看视频| 久久精品国产亚洲AV片多多| 极品色社| 18禁的网站在线| AV天堂因数| 超碰视97中文| 九九九久千久久激情蜜桃在线看 | 韩国午夜理伦三级好看| 九一国产精品| 嗯阿好爽好紧| 国产精品嫩草影院免费| 清纯唯美亚洲| 美女91网| 天天综合网视频91| 久久久久13| 亚洲 国产 精品一区| 婷婷干黄色| 亚洲骚逼少妇| 人人澡人人干| 欧美在线亚洲| 日韩人人精品| 黄色一区三区| 激情综合网一盗摄| 歐美性天天| 亚洲涩涩| 久久久久久久久久久久欧美日| 精品无码久久久| 欧美日韩性感| 久久久9品一区二区三区| 人妻干天天| 国产真实野战在线视频| 亚洲色婷婷综合久久一区二区三区| 亚洲欧美大| 亚洲黄色电影| 久久久青青草| 久久久久久久伊人精品| 久久人妻办公室视频| 男人的天堂啪啪| 嫖老熟女A片一二三区| 精品少妇后入一区二区三区四区人妻巨乳 | 九九九九免费视频| 久久东京热久久| 91日日| 绑缚麻绳人妻寝取完整版| 诱惑人妻欧美一区在线播放| 精品一区二区麻豆| 精品乱码久久久久| 蜜臀av中文字幕| 999999精品| 黄色大片免费在线| 熟女六十路| 蜜桃成人1区2区3区| 日本不卡高清免v欧美日韩在线观看| 60秒试看最爽10分钟网站| 天天综合网~91综合网| 国产丝袜啪啪| 成人性爱视频在线看| 激情婷婷| 国产十八禁视频| 亚洲黑人在线| α√在线| 丰满搜索结果 -第18页- 久久高清无码| 欧美性综合| 久久78| 婷婷亚洲五月***久久| 一区 欧美 日韩 麻豆| 91综合天天看| 国产精品自拍xxxx| 日本大香蕉| 男女性无套 免费九一| 黄色片大香蕉| 超碰久久精品| 国产亚洲精品美女久久久| 欧美后进式| 男人的天堂VA| 最新中文字幕精品在线| 成人一区二区三区四区| 99蜜桃臀亚洲成人在线观看| 75大香蕉| 成人夜夜爽| 人人爱人人乐人人操| 日韩视频小说在线观看| 国产视频不卡在线观看| 少妇专区一二三四五| 欧美亚洲性爱一区二区| 中文字幕乱码人妻二区三区| 加勒比色综合| 人人手机欧洲亚洲国产人妻| 亚一综合久久久久久久久久| 欧美最婬乱婬爆婬牲视频| 色九九九九久| 顶级丝袜熟女一区二区三区 | 3P乱轮视频| 色狠人在线99| 99在线观看| 亚洲最大成人a毛毛片| 中文字幕一区二区三区四五区| www鬼畜国产男人的天堂| 高清国产成人无码| 欧美精品宗合| 玖玖爱伊人玖玖爱| 日本免费一区二| 国产成人+综合亚洲+天堂| 欧美一级黄色免费专区| 爱丝福利| 日日夜夜草草草| 99啪| 国产精品一区二区 尿失禁| 性猛交| 91久久国产精品| 夜夜騷av、一區二區| 97精品综合久久| 亚洲h片在线免费观看| 日韩小电影| 热热色AV| 久久久久久久久久精| 亚州色站 日韩电影| 麻豆国产96在线| 无码人妻精品一区二区三区99不卡| 天天碰久久入| 男人天堂久久精品不卡| 怡春苑东京热| 宅男91视频在线播放| 精品 码产区一区二-1080P高清在线www-B029AV | 日本天天色| 久久久久久亚洲精品中文字幕人妻| 国产呦精品一区二区三区下载| 天天干夜夜一操| 蜜臀Av一区二区三区| 九九九九九九成人| 欧美日韩性爱精品| 国产在线综合网| 91精品91久久久久77777| 久久久久亚洲一区女同性恋中文字幕| 欧洲免费一区二| 婷婷五月天补不补| 99re久久| 岛国黄色大片网站| 91 亚洲 欧美 日韩 国产 综合| 性暴力欧美猛交在线直播| 色综合一区二区三区| 超碰免费97| 玖玖综合网| 亚洲日韩精品一区二区| 婷婷激情五月综合| 久久中文字幕女同性恋一区| 欧美亚洲厕所精品偷拍91 | 天堂无码| .精品人妻一区二区三| 丰满人妻被猛烈进入中| 一区二区三区国产在线播放| 人妻无码一区二区三区久久99| 男人的天堂日韩| 神马九九九| 日韩中文字幕视频在线观看| www.人人cao| 欧洲熟妇xxXx欧美老妇裸体 | 91日韩国产欧美亚洲另类精盘州至城都| 肉丝中文无码高清| 色97欧美| 人妻天堂网| a片 xxxx受爽视频| 精品日韩人妻视频| 国产最新小视频在线播放下载| 精品视频免费在线一区| 园内精品自拍视频在线播放| 粉嫩粉嫩一区性色AV片| 国产精品自拍xxxx| 亚洲免费人妻在| 欧美国产日韩高清在线| 日本天天操| 成人色女网| 大香蕉伊在线久草麻豆天堂故事| 欧美日韩婷婷中文| 亚洲中文sv| 人人妻人人爱人人玩| 人人操人人舒服| 国产小视频91| 亚洲国产日韩欧美熟妇在线| 欧美亚涩| 人妻激情在线视频| 日韩综合97p| 日本人妻最新在线中| 思思热在线视频在线| 国产野战露脸在线播放| 精品人妻美妇91job| 日韩免费人妻色情网站| 伊人伊人LD| 肥臀熟女一区二区三区视频| 91在线免费精品视频| 一级啊性爱在线视频| 天天日日夜夜| 天天天天天天天天综合| 亚洲欧美清纯| 日韩欧洲操屄视频| 日韩成人电影AV| 91挑色欧美| 91亚洲影视| www.久久制服糖| 午夜精品久久久久久久男人的天堂 | 青青草原av| 亚洲电影中字一区二区| 欧美日韩性爱操大逼| 欧亚不卡| 日韩熟妇二区| 91影视亚洲| 98人妻精品一区二区色欲| 7777欧美成是人在线观看| 97爱免费插| 日韩天天综合| 高清无码一区二区三区| 欧美性天天影视| 亚洲资源吧| 国产成年精品高清在线观看91| 色五月婷婷网| 亚洲骚男同com| 久久久久久久九九九九九九| 激情五月婷婷| SUV一区二区在线看| 久久78| 97综合在线| 久久99深爱久久99精品| 亚洲精品一二牛牛| 午夜免费视频1000| 精品久久97| 天天干夜夜一操| 大香蕉在线视频重口味毛片在线| 欧美影院一区二区三区| 香蕉久久国产AV一区二区| 亚洲熟久久| A V视频日本| 国产精品久久久久久夜夜夜| 亚洲精品97久久| 久久久A∨| 成人九九| 国产亚洲国产超碰| 91美女视频直播| 久久6热视频免费观看| 啊啊啊啊在线观看网址| 国产JDAV无码视频在线观看| 人人喜人人妻| 男人的天堂三级| 五月婷婷丁香中文字幕| 超碰在线1234区| 在线观看色视频| 久久少妇人妻| 成人性爱高清视频免费看| av线电影| 一区二区三区探花在线观看| 亚洲日韩久久精品一区| 亚洲无码免费看| 97色色色综合网站| 91九色蝌蚪在线观看| 啊啊啊啊在线观看网址| 级做a爱无码性色永久免费| 九九九九九九亚洲| 日本羞羞的视频在线播放| 欧美日韩人人精品| 日本一级特级毛片视频| 刺激精品视频| 欧美αv.com| 亚洲精品不卡一二三区| 久久艹逼视频| 欧美草草高清日韩视频| 久久久免费一级黄片| 97中文字幕九区| 久久久9999| 亚洲欧洲色情高清| 两性色网| 日本久久久久久久久久| 男人的天堂在线有码| 日本熟妇浓毛hdsex| 校园春色综合色| 国产91乱伦| 日本 情色 1区2区3区| 欧美黑人XXXⅩ高潮交| 欧美日韩在线视频网站| 日韩在线97| 免费综合亚洲中文| 国产成人五月天丁香花| 久久国产精品91| 最新亚洲人成网站在线影院| 色亚州人久干视频在线观看免费版| 亚洲精品人妻吞精av| 五月天婷婷社区| 嫩草伊人久久精品| 黄色视频特级毛片| 欧美中字不卡| 欧美性爱97超碰| 手机在线A片| 囯产精品久久久久久久久久二区三区| 国产专区路线| 国产精品久久伊人| 黄片免费视频2019| 国产精品对白自产拍| 国产视频一区二区免费| 欧美日韩国产一区二区小黄片大全| 97爱b| 久悠悠av| 国产精品免费视频人成| 啊啊啊想要| 日本精品一区二区三| 精品少妇后入一区二区三区四区人妻巨乳 | 欧美激情一区二区| 亚洲操人| 天天操天天射天天日| 国产精品一区二区三区免费视频| 中文字幕第23区| 又大又黄国产| 亚洲国产麻豆一区二区三区| 最近二区三区视频大全| 99久在线精品99re8a| 久久久精品日本一道| 婷婷激情五月天小说网| 黄色无码高清黄色无码网站| 清纯唯美第一页| 久久久久久久久久久久黄色 | 色哟哟-国产专区| 九九RE视频在线精品| 1000部熟女视频在线观看| 十八禁黄色| 新精精品久久精品| 夜夜操狠狠操| 色婷婷网| 超碰成人最新最好看| 国产精品久久久久久久AV大片 | 啊啊啊不要好爽日韩无码一区| 大鸡巴久久久| 婷婷综合五月| 亚洲精品一区二区三区在线播放| 人人玩人人添人人澡免费| 国产一区在线看| 久久精9| 国产AV人人 夜夜人人澡| 久久久久13| 91天美| 日韩91网| 日本免费二区三区| 四虎国产成人精品免费一女五男| 青青国产精品在线| 又黄又爽在线观看视频| 色官网在线| 日韩欧美字幕亚洲一区二区| 精品人妻一区二区视频| 五月天婷婷在线看| 日韩 国产 欧美自拍| 亚洲美女av无码| 偷拍精品一区二区三区| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 五月婷婷AV| 久久人人舔人人爽舔人人av片| 美国黄片aaa| 精品蜜乳AV免费观看| 婷婷色色五月天福利| 中文字幕在线观| aa片毛片| 国产一级舔足在线观看| 丁香七月婷婷| 免费岛国一级片| 伊人影院日本| 自拍偷拍亚洲熟女妇人精品| 亚洲欧洲中文日韩女优乱码| www.色吧5.com| 多毛小伙内射老太婆| 成人性爱av.com| 久久久久久AⅤ无码免费肉站 | 色哟哟 日韩精品| 在线人成亚洲视频免费观看| 亚洲一区操| 亚洲天堂人妻熟妇视频| 九月丁香综合网| 久久精品色欧美aⅴ一区二区| 91热爆在线| 五月婷婷六月色| 999久久久久久久精| 欧美美女在线高潮999| 欧美 日韩 另类 亚洲| 中文字幕乱偷人妻久久艾草网| 美熟女逼导航AV操逼| 99re这里只有| 中文字幕三四区| 亚洲se91| 粉嫩av久久一区二区三区| 国产在线视频二区| 天天做日日爱夜夜爽| 99激情视频| 男人的天堂啪啪啪啪啪蜜桃不卡| 日本免费不卡二区| 精品一久久久| 欧美自拍网| 激情婷婷综合久久| 伊人五月天激情| 激情丁香五月婷婷| 96AV精品| 超碰日韩美妻| 啊啊啊操死我| 久久久久深夜无码| 亚洲天堂资源网| 亚洲精品无码成人久久久99| 婷婷五月天av| 亚洲一区日韩| 久久亚洲人妻| 91M一社| 亚洲另类小说卡通动漫| 新版天堂中文资源8在线| 男人的天堂激情| 97欧美色综合| 亚洲全色网| 中文字幕 国产 精品| 欧美日韩m| 一本一道久久综合久久| 免费精品无码一级毛片牛牛影视 | 久久精品国产AV一区二区三区| 91精品无码人妻系列| 国精品一区二区三| 欧美成人精品一区二区男人蜜臀| 蜜臀久久99精品久久久久久婷婷| 在线国产福利网址导航| 色性综合| 91色欧美| 日韩美女操b| 日韩天堂av电影在线观看| 日韩综合色网| 欧美区亚洲区偷拍区| 91黑丝露脚| 蜜臀av中文字幕| 久久性生大片免费观看性| 欧美黑人精品一区二区| 国内操逼视频二区| 91视频在线观看18| 噜噜噜在线视频| 亚州综合电影| 91国模| 天天操天天插| 91美女国产在线| 密乳无码| 日日干日日操五月天伦理视频| 99999国产精品| 黄片不用下载在线观看| 色眯眯av| 看免费的黄片| 精品久久在线区一区| 欧美色图电影| 五月天丁香网| 正宗无毛一线天嫩逼| 午夜一区二区三区国产| 亚洲av热热色| 在线亚洲欧美| 九九玖玖精品| 香蕉视频欧美一卡二卡| 老女人爆菊| 少妇天堂| 亚洲欧洲综合视频在线| 蜜臀va69| www网站黄| 黑白配性爱AV成| 日韩国产乱子伦App| 天天超级碰碰碰| 男人天堂黄片| 色哟哟av网址| 粉嫩粉嫩一区性色AV片| 校园春色欧美| 综合久久六月久久婷婷| WWW美腿丝袜香蕉中文| 97人人操人人摸人人爱| 日韩午夜国产| 91成人久久| 人澡逼| 91久久久久久久| 久久久啊啊啊| 日韩亚洲美女一区久久| 亚洲色图图片| 绯色AV粉色AV蜜臀AV| 欧美片第一页| 久久一区二区高清免费| 久久久久久中文版| 强奸乱伦麻豆| WWW美腿丝袜香蕉中文| 99综合免费视频| 一区二区三区麻豆| AND人妻系列| 国产日产精品久久快鸭的功能介绍| 天天操天天射青青草| 国产精品久久久啊| 操久久久久久| 国产午夜福利电影免费在线观看 | 国产人妻天天干精品| 91精品国产91久久久久久久久久久久| 国产亚洲精品av一区| 美女91网址 | 国产又黄又粗又猛大片| 亚洲色图欧美另类在线| 奇米四色影视777久久久| 久久精品老司| 日本熟妇人妻中出视频| 欧日韩一二三f区| 操我啊啊啊啊啊| 91精品女厕偷拍视频| 99re这里只有精品2| 操人妻少妇中文 | 激情在线青青操| 熟女啪啪视频| 国产欧美岛国精品一区| 青青草原伊人网| 亚洲一二三四区机械| 九月丁香婷婷色| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 国语人妻精彩刺激| a级成人毛片免费视频高清| 四虎AV在线播放| 亚洲国产一级中文综合久久天堂在线免费观看| 370p日韩欧美亚洲精品| 97bbn| 中文字暮97| 国产一区二区a毛片| 人妻少妇精品视频一区二区三区| 福利风月五月天影院| 久久这里只精品99re66图| 天天澡天天狠天天天做| 插B在线观看| 按摩中文字幕| 97久久久| 成人26uuu| 香蕉综合网| 日日日大屁股骚女人精品| 澳门成人网站久国产日韩| 玖玖爱在线视频免费观看| 人妻熟女一区二区三区视频| 亚洲棕合电彰| 男人亚洲91首页在线| 欧美传媒| 蜜臀久久99精品久久久久久无删减 | 97超碰色屌| 免费看久久久性性| 国产日韩欧美操逼视频| 无码人妻一区二区三区四区老鸭窝| 欧美激情色婷婷花野真衣一区二区| 久久九九99| 日本精品第一视频在'| 蜜乳AV免费观看| 丰满人妻区一区二区三| 人妻无码视频一区二区三区久久| 欧美精品久久96人妻无码| 伊人婷婷五月天| 亚洲午夜福利在线影院| 国产91影院| 欧美狠狠干| 清纯唯美第一页| 青青草中出视频 | 九九久久99| 秋霞一级视频在线观看免费| 被男人吃奶很爽的毛片| 尤物视频视频官网| 天天射天天色成人| 欧美亚洲清纯| 九九九九欧美| 97在线青| 青青草视频在线观看一区二区| 久草综合京东| 婷婷久久综合久| 亚洲激情网| 色色色色日本| 少妇无码av专区线| 亚洲一区二区三区春色| 日韩色香| 国产精品九九九| 国产精品夜夜| 亚洲国产97| 欧美性夜| 午夜超碰| 精品999一区二区| 亚洲精品九九九| 国产sv美女内射| 96久久久久| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 啊啊啊爽爽| 久久超碰网| 69精品| 无码不卡亚洲成?人片| 久久久久成人网| 丰满少妇高潮无码| 天天操天天舔| 激情啪啪拍91| 日韩探花精品在线视频| 日韩成人大片在线观看| α√在线| 五月丁香六月婷| 婷婷五月av| 色香色香欲天天天影视综合网| 天天干少妇| 色五月综合网| 红桃视频高潮| 亚洲中文电影| 九九亚洲精品| 综合91网| 亚洲成人AB| 亚洲少妇视频| 成人毛片免费| 精品亚洲一区在线观看| 欧美性爱中文字幕无线码| 国产aⅴ无码片毛片一级网站| 天天干天天操天天干天天操 | 男生通女生屁股| 怡春院久久| 人人弄人人摸| 青青草中文字幕| 色色色色日本| 狠狠爱综合网| 欧美色九九九| 中文字幕色AV| 999久久久国产精品| 内射夫妻三片| 亚洲av综合色区无码一| 色综合五月天| 日本精品88888888| 欧美天天综合站| 亚洲欧美综合|