色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合av,久久激情五月丁香伊人

ARTICLE DETAIL

資訊詳情

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

Linux fork函數(shù)詳解:返回值、COW寫時(shí)復(fù)制與僵尸進(jìn)程排查

Linux fork函數(shù)詳解:返回值、COW寫時(shí)復(fù)制與僵尸進(jìn)程排查 第一次看到fork這個(gè)函數(shù)我盯著那句“調(diào)用一次返回兩次”琢磨了挺久——一個(gè)函數(shù)怎么可能有兩次返回后來在內(nèi)核源碼里把kernel_clone到copy_process這條路走了一遍才算真正把這件事想通。它難懂不是因?yàn)楦拍钣卸嘈醵且驗(yàn)樗荒_踩在用戶態(tài) API 和內(nèi)核調(diào)度器的交界處你在 C 代碼里看到的只是一行函數(shù)調(diào)用背后卻是整個(gè)進(jìn)程地址空間的復(fù)制、頁表的重新登記、調(diào)度實(shí)體的插入。Linux 的 fork 函數(shù)幾乎是所有多進(jìn)程程序的起點(diǎn)從 shell 執(zhí)行命令、Nginx 拉起 worker、到你自己寫的批量任務(wù)分發(fā)腳本底層都是同一套東西。這篇文章我想寫給兩類人一類是剛學(xué)完操作系統(tǒng)課本、知道“fork 會(huì)復(fù)制進(jìn)程”但一寫代碼就蒙的同學(xué)另一類是在項(xiàng)目里被僵尸進(jìn)程、緩沖區(qū)重復(fù)輸出、子進(jìn)程不受控這些問題咬過、想把這套機(jī)制徹底捋順的開發(fā)者。我會(huì)從內(nèi)核實(shí)現(xiàn)路徑、返回值語義、代碼實(shí)操、參數(shù)取舍一路講到排查實(shí)錄代碼都能直接跑坑也都標(biāo)出來。1. fork 的本質(zhì)一次調(diào)用為何有兩次返回1.1 從用戶態(tài)看它只是三個(gè)整數(shù)之一從調(diào)用者角度看fork的接口簡單到幾乎沒有任何可配置項(xiàng)——沒有參數(shù)沒有任何 flag只返回一個(gè)pid_t。這個(gè)返回值分三種情況必須先記牢因?yàn)楹竺?90% 的 bug 都源于這里判斷錯(cuò)了返回值出現(xiàn)在哪個(gè)進(jìn)程含義 0父進(jìn)程這個(gè)值是剛創(chuàng)建出來的子進(jìn)程 PID 0子進(jìn)程說明“我就是那個(gè)新進(jìn)程”沒有別的信息 -1父進(jìn)程創(chuàng)建失敗原因看errno有一點(diǎn)很容易被忽略子進(jìn)程拿到的 0 不是“子進(jìn)程的 PID 是 0”而是一個(gè)標(biāo)記位。子進(jìn)程想知道自己的 PID 得調(diào)getpid()想知道爹是誰得調(diào)getppid()。我見過不少人寫成if (pid 0) { /* 子進(jìn)程 */ }邏輯反了還不報(bào)錯(cuò)程序在多核機(jī)器上跑出來的結(jié)果飄忽不定排查半天才發(fā)現(xiàn)是分支寫反。#include stdio.h #include unistd.h #include sys/types.h int main(void) { pid_t pid fork(); if (pid 0) { perror(fork); return 1; } else if (pid 0) { printf(child : pid%d ppid%d\n, getpid(), getppid()); } else { printf(parent: pid%d child%d\n, getpid(), pid); } return 0; }編譯就用gcc -Wall -O0 fork_demo.c -o fork_demo加-Wall是習(xí)慣編譯器對fork相關(guān)的返回值未檢查會(huì)給出提示能擋掉一批低級(jí)錯(cuò)誤。1.2 內(nèi)核里那條路從系統(tǒng)調(diào)用到copy_process用戶態(tài)的一次fork()最終會(huì)落到內(nèi)核的sys_forkx86-64 上走_(dá)_x64_sys_fork再進(jìn)到kernel_clone。這個(gè)名字在不同內(nèi)核版本里變過老版本叫_do_fork5.x 之后統(tǒng)一成kernel_clone。真正干重活的是copy_process它按順序做了這么幾件事dup_task_struct復(fù)制一份task_struct和內(nèi)核棧此時(shí)父子進(jìn)程的描述符已經(jīng)存在但內(nèi)容還很“空”。一系列權(quán)限與配額檢查RLIMIT_NPROC限制、系統(tǒng)級(jí)線程數(shù)上限、用戶進(jìn)程數(shù)上限任何一項(xiàng)超了就直接返回錯(cuò)誤。sched_fork給新任務(wù)初始化調(diào)度實(shí)體把它掛到調(diào)度器上但此時(shí)還沒真正運(yùn)行。copy_files、copy_fs、copy_sighand這幾項(xiàng)大多是增加引用計(jì)數(shù)而不是深拷貝。打開的文件表、信號(hào)處理函數(shù)表、工作目錄這些父子共享同一份內(nèi)核對象。copy_mm這是最重的一步復(fù)制內(nèi)存描述符、遍歷所有 VMA、復(fù)制頁表并把父子雙方的頁表項(xiàng)統(tǒng)統(tǒng)改成只讀。alloc_pid分配一個(gè)新的 PID。wake_up_new_task把子進(jìn)程放進(jìn)運(yùn)行隊(duì)列等調(diào)度器挑中它。父進(jìn)程在kernel_clone返回處拿到子進(jìn)程 PID子進(jìn)程不是“返回”到這個(gè)位置而是被調(diào)度到時(shí)從ret_from_fork這條棧幀直接跳回用戶態(tài)返回值寄存器被填成 0。所以“一次調(diào)用兩次返回”這個(gè)說法其實(shí)有點(diǎn)誤導(dǎo)——它不是同一個(gè)函數(shù)返了兩遍而是兩個(gè)獨(dú)立的執(zhí)行流各自從內(nèi)核態(tài)穿越回用戶態(tài)只是它們穿越前在同一段內(nèi)核代碼里待過。1.3 為什么不做全量拷貝COW 的取舍邏輯如果fork真的把父進(jìn)程幾百 MB 內(nèi)存整塊復(fù)制一遍那創(chuàng)建一個(gè)進(jìn)程的開銷會(huì)大到?jīng)]法用。早期的確是這個(gè)思路fork后緊跟execve的場景浪費(fèi)極其嚴(yán)重——復(fù)制了一大堆馬上要被覆蓋的內(nèi)存。寫時(shí)復(fù)制Copy-On-Write簡稱 COW就是為了解決這個(gè)浪費(fèi)copy_mm復(fù)制頁表時(shí)父子進(jìn)程的頁表項(xiàng)指向同一批物理頁只是把這些頁的權(quán)限位從可寫改成只讀同時(shí)在task_struct里把頁標(biāo)記成 COW 頁。真正的復(fù)制推遲到有人寫的那一刻。任意一方寫入觸發(fā)缺頁異常內(nèi)核發(fā)現(xiàn)這是個(gè) COW 頁才分配新物理頁、把原內(nèi)容拷過去、改回可寫然后重新執(zhí)行那條指令。這個(gè)設(shè)計(jì)的精妙之處在于只讀的父子進(jìn)程幾乎零成本只有真正被修改過的頁才付出復(fù)制代價(jià)。但 COW 不是沒有成本。fork的耗時(shí)和進(jìn)程當(dāng)前占用的虛擬內(nèi)存成正比因?yàn)轫摫肀旧硪獜?fù)制。粗算一下x86-64 上普通頁是 4KB一個(gè)占 1GB 內(nèi)存的進(jìn)程大約有 26 萬個(gè)頁表項(xiàng)每個(gè) PTE 8 字節(jié)光頁表數(shù)據(jù)就是 2MB 左右再加上遍歷 VMA 的時(shí)間。所以你會(huì)發(fā)現(xiàn)一個(gè)現(xiàn)象——空進(jìn)程fork微秒級(jí)就完了幾百 MB 的服務(wù)進(jìn)程fork一次可能要好幾個(gè)毫秒。這個(gè)結(jié)論直接影響了后面的選型判斷。注意COW 讓父子共享物理頁但邏輯上是兩個(gè)獨(dú)立的地址空間。子進(jìn)程里的malloc返回值在父進(jìn)程里沒有任何意義別指望用這個(gè)地址跨進(jìn)程傳數(shù)據(jù)那需要共享內(nèi)存或者管道。2. 執(zhí)行流、競爭與繼承那些課本上不講清楚的事2.1 父子誰先跑答案是“不知道”fork返回之后父進(jìn)程和子進(jìn)程誰先被 CPU 執(zhí)行完全由調(diào)度器決定沒有任何順序保證。在多核機(jī)器上兩個(gè)進(jìn)程大概率是真并行在單核上時(shí)間片怎么分也看調(diào)度策略。這意味著任何依賴“父進(jìn)程先執(zhí)行完再輪到子進(jìn)程”的代碼都是錯(cuò)的。我踩過的第一個(gè)坑就出在這里一個(gè)父進(jìn)程里 fork 之后立刻往共享的文件描述符寫數(shù)據(jù)子進(jìn)程也寫結(jié)果兩次實(shí)驗(yàn)跑出來的內(nèi)容順序完全不一樣。當(dāng)時(shí)以為是文件系統(tǒng)的問題其實(shí)是執(zhí)行順序不確定。正確的處理方式是顯式同步——用waitpid等子進(jìn)程結(jié)束用管道通信用信號(hào)量互斥而不是靠“大概會(huì)先跑我”。#include stdio.h #include unistd.h #include sys/wait.h int main(void) { pid_t pid fork(); if (pid 0) { printf(child working\n); _exit(0); } int status 0; waitpid(pid, status, 0); printf(child exited, status%d\n, WEXITSTATUS(status)); return 0; }子進(jìn)程退出用_exit而不是exit這是個(gè)細(xì)節(jié)但很重要。exit會(huì)執(zhí)行atexit注冊的函數(shù)、刷新 stdio 緩沖區(qū)而這些緩沖區(qū)是從父進(jìn)程繼承來的如果父進(jìn)程 fork 前有沒刷新的內(nèi)容子進(jìn)程exit時(shí)又刷一遍輸出就重復(fù)了。_exit直接走系統(tǒng)調(diào)用跳過所有這些用戶態(tài)清理干凈利落。2.2 文件描述符繼承共享的不只是“編號(hào)”fork之后子進(jìn)程會(huì)得到父進(jìn)程所有打開文件描述符的副本但這里有個(gè)特別容易誤解的地方復(fù)制的是描述符不是文件對象。父子雙方各自的 fd 編號(hào)可能不同但它們指向同一個(gè)struct file而struct file里存著文件偏移量。后果很直觀父進(jìn)程讀了 100 字節(jié)子進(jìn)程接著讀會(huì)從第 101 字節(jié)開始而不是從頭讀。寫文件同理兩邊交替寫會(huì)互相覆蓋偏移。我在做一個(gè)日志切分的小工具時(shí)就被這個(gè)咬過父子都往同一個(gè)日志文件追加結(jié)果日志里出現(xiàn)了大片空洞——因?yàn)閮蛇叾荚谟胠seek挪同一個(gè)偏移量。想避免這個(gè)問題常規(guī)做法是父子需要獨(dú)立讀寫位置時(shí)子進(jìn)程 fork 之后自己重新open一次文件或者應(yīng)用層用O_APPEND打開讓每次寫都由內(nèi)核原子地定位到文件末尾或者干脆別讓多個(gè)進(jìn)程寫同一個(gè)文件改成各自寫各自的后續(xù)再合并。除了文件描述符子進(jìn)程還會(huì)繼承當(dāng)前工作目錄、信號(hào)處理方式SIG_IGN和自定義處理函數(shù)都繼承但未處理的信號(hào)會(huì)重置為默認(rèn)、umask、環(huán)境變量、資源限制。這些在寫守護(hù)進(jìn)程的時(shí)候會(huì)集中爆發(fā)問題。2.3 多線程進(jìn)程里 fork 的隱藏雷區(qū)這是我認(rèn)為最需要單獨(dú)拎出來說的一條。fork只會(huì)復(fù)制調(diào)用它的那個(gè)線程其他線程在子進(jìn)程里全都不存在。但問題來了那些線程持有的互斥鎖、條件變量、讀寫鎖狀態(tài)是被原樣復(fù)制過去的。如果 fork 的瞬間某個(gè)鎖正被另一個(gè)線程持有那么在子進(jìn)程里這把鎖永遠(yuǎn)處于“被鎖住”的狀態(tài)而持有者已經(jīng)不存在了任何試圖加鎖的代碼都會(huì)永久阻塞。規(guī)避方式有三條路按推薦程度排fork 完立刻 execve。這是最安全的姿勢execve會(huì)把整個(gè)用戶態(tài)地址空間換掉鎖的狀態(tài)也一并消失。絕大多數(shù)“fork 后要干事”的場景其實(shí)都該走這條路。fork 之前保證沒有其他線程在跑比如在程序啟動(dòng)早期就把需要 fork 的邏輯做完。用pthread_atfork注冊 prepare/parent/child 三個(gè)鉤子在 fork 前后手動(dòng)加解鎖。這套機(jī)制能解決問題但很容易寫成死鎖尤其是涉及多把鎖的時(shí)候加鎖順序稍不注意就翻車。提示如果你的程序用了線程池同時(shí)又有 fork 子進(jìn)程的需求請優(yōu)先考慮把子進(jìn)程部分改成獨(dú)立進(jìn)程或者獨(dú)立的服務(wù)不要在同一進(jìn)程里混用?;煊脦淼恼{(diào)試成本遠(yuǎn)高于拆開的改造成本。3. 動(dòng)手實(shí)操從最小 Demo 到可用的進(jìn)程管理3.1 循環(huán) fork 的 2 的 n 次方陷阱先看一段看起來人畜無害的代碼for (int i 0; i 3; i) { fork(); printf(pid%d, i%d\n, getpid(), i); }很多人以為這會(huì)產(chǎn)生 3 個(gè)子進(jìn)程加 1 個(gè)父進(jìn)程。實(shí)際結(jié)果是 8 個(gè)進(jìn)程。原因在于fork之后父進(jìn)程繼續(xù)循環(huán)子進(jìn)程也從 fork 的下一行繼續(xù)執(zhí)行于是它也進(jìn)入下一輪循環(huán)并且再次 fork。每一輪都把當(dāng)前進(jìn)程數(shù)翻倍3 輪就是 23 8。這個(gè)行為本身沒錯(cuò)是很多人對“子進(jìn)程從哪開始執(zhí)行”的理解有偏差。子進(jìn)程不是從main重頭開始而是從fork返回點(diǎn)繼續(xù)。如果確實(shí)需要?jiǎng)?chuàng)建 N 個(gè)并列的工作進(jìn)程比如預(yù)派生模型正確寫法是在子進(jìn)程里立刻跳出循環(huán)#define WORKERS 4 for (int i 0; i WORKERS; i) { pid_t pid fork(); if (pid 0) { perror(fork); break; } if (pid 0) { worker_loop(i); /* 子進(jìn)程干活不再進(jìn)入下一輪 */ _exit(0); } } /* 父進(jìn)程在這里統(tǒng)一 wait */關(guān)鍵就是if (pid 0)分支里干完活直接_exit絕不落回循環(huán)體。這個(gè)模式叫預(yù)派生pre-forkNginx 的 worker 模型、老式 Apache 的 prefork 都是這個(gè)思路。好處是每個(gè) worker 獨(dú)立壞處是 worker 數(shù)在啟動(dòng)時(shí)就固定了得配合平滑重啟來調(diào)整。3.2 用 fork execve 寫一個(gè)迷你 shell想真正理解 fork最好的練習(xí)是寫一個(gè)能跑命令的 shell。它的核心邏輯只有四步讀一行、切參數(shù)、fork、子進(jìn)程 exec。#include stdio.h #include stdlib.h #include string.h #include unistd.h #include sys/wait.h #define MAXLINE 1024 int main(void) { char line[MAXLINE]; while (fgets(line, sizeof(line), stdin) ! NULL) { line[strcspn(line, \n)] \0; if (line[0] \0) continue; if (strcmp(line, exit) 0) break; char *argv[64]; int argc 0; char *tok strtok(line, ); while (tok ! NULL argc 63) { argv[argc] tok; tok strtok(NULL, ); } argv[argc] NULL; pid_t pid fork(); if (pid 0) { perror(fork); continue; } if (pid 0) { execvp(argv[0], argv); perror(execvp); /* 只有 exec 失敗才會(huì)走到這里 */ _exit(127); } int status 0; waitpid(pid, status, 0); if (WIFEXITED(status)) { printf([exit %d]\n, WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf([killed by signal %d]\n, WTERMSIG(status)); } } return 0; }幾個(gè)值得說的點(diǎn)。execvp會(huì)自己去PATH里找可執(zhí)行文件所以直接敲ls就能跑。execvp成功的話永遠(yuǎn)不會(huì)返回返回值只在失敗時(shí)有用失敗后必須_exit(127)用 127 是 shell 界的慣例表示“命令沒找到”。waitpid拿到的status是個(gè)打包值不能直接當(dāng)退出碼用得用WIFEXITED、WEXITSTATUS、WIFSIGNALED這些宏去拆。我第一次寫的時(shí)候直接printf(%d, status)輸出 256 讓我困惑了很久——其實(shí)真實(shí)退出碼是 1因?yàn)橥顺龃a存在高 8 位。這個(gè) shell 還很粗糙不支持管道、重定向、后臺(tái)任務(wù)但骨架已經(jīng)對了。想支持管道就需要在 fork 之前先pipe()然后兩個(gè)子進(jìn)程分別把dup2把讀端寫端接到標(biāo)準(zhǔn)輸入輸出上這是個(gè)很好的練手項(xiàng)目。3.3 并行任務(wù)分發(fā)怎么定并發(fā)數(shù)再給一個(gè)更貼近實(shí)際工作的例子——把一批耗時(shí)任務(wù)拆給多個(gè)子進(jìn)程并行跑。這個(gè)模式在數(shù)據(jù)預(yù)處理、批量轉(zhuǎn)碼、壓測腳本里特別常見。#include stdio.h #include unistd.h #include sys/wait.h #define JOBS 4 static void do_work(int id) { sleep(1); /* 模擬耗時(shí)計(jì)算 */ printf(job %d done by pid %d\n, id, getpid()); } int main(void) { pid_t pids[JOBS]; for (int i 0; i JOBS; i) { pid_t pid fork(); if (pid 0) { perror(fork); pids[i] -1; continue; } if (pid 0) { do_work(i); _exit(0); } pids[i] pid; } for (int i 0; i JOBS; i) { if (pids[i] 0) { int status 0; waitpid(pids[i], status, 0); printf(child %d reaped, status%d\n, pids[i], WEXITSTATUS(status)); } } return 0; }并發(fā)數(shù)怎么定我的經(jīng)驗(yàn)是別超過 CPU 邏輯核數(shù)。純計(jì)算型任務(wù)進(jìn)程數(shù)等于核數(shù)時(shí)吞吐最高再多只會(huì)增加上下文切換和內(nèi)存壓力。可以用sysconf(_SC_NPROCESSORS_ONLN)拿到當(dāng)前可用核數(shù)再乘一個(gè)系數(shù)I/O 密集型任務(wù)等待磁盤、網(wǎng)絡(luò)系數(shù)取 2 到 4CPU 密集型任務(wù)系數(shù)取 1每個(gè)子進(jìn)程內(nèi)存占用大比如幾百 MB還得反過來壓低數(shù)量防止觸發(fā) OOM。另外要注意waitpid的回收順序。上面這段代碼是按創(chuàng)建順序回收的如果第 0 個(gè)任務(wù)特別慢后面三個(gè)早就跑完了也得等著。想做到“誰先完誰先回收”用waitpid(-1, status, 0)循環(huán)回收任意子進(jìn)程或者干脆用SIGCHLD信號(hào)處理。4. 資源、參數(shù)與選型什么時(shí)候該用 fork什么時(shí)候不該4.1 fork 失敗的兩種典型 errnofork返回 -1 時(shí)errno最常見的兩個(gè)值是EAGAIN和ENOMEM含義完全不同排查方向也不一樣。EAGAIN表示“資源暫時(shí)不夠”通常是進(jìn)程數(shù)配額打滿了。要檢查幾個(gè)地方RLIMIT_NPROC用ulimit -u看、系統(tǒng)級(jí)kernel.pid_max、kernel.threads-max還有 cgroup 里的pids.max。在容器環(huán)境里跑最容易撞的是 cgroup 的 pids 限制從宿主機(jī)上看一切正常容器里怎么都 fork 不出來。我遇到過的一次就是容器 pids 上限設(shè)得太小業(yè)務(wù)里但凡有個(gè) fork 都失敗日志里只留一行“Resource temporarily unavailable”查了半天才定位到配額。ENOMEM則是內(nèi)存不夠。注意這不一定是物理內(nèi)存耗盡也可能是因?yàn)?COW 機(jī)制下內(nèi)核需要為新進(jìn)程分配task_struct和內(nèi)核棧同時(shí)在復(fù)制頁表時(shí)需要申請內(nèi)存。內(nèi)存緊張時(shí)一個(gè)本身不大的進(jìn)程 fork 也可能失敗。這時(shí)候該看的是dmesg里有沒有 OOM 相關(guān)記錄以及/proc/meminfo的CommitLimit和Committed_AS。堆棧上還有一個(gè)坑內(nèi)核棧默認(rèn)不大歷史上是 8KB某些配置下更小fork本身不占用戶棧但如果你的代碼在fork前遞歸很深子進(jìn)程復(fù)制的是整個(gè)地址空間的映射雖然 COW 不會(huì)立刻復(fù)制物理頁但虛擬地址空間的布局是完全一致的棧溢出風(fēng)險(xiǎn)同樣被繼承過去。4.2 fork、vfork、clone、posix_spawn 怎么選這四個(gè)東西經(jīng)常被放在一起比較但它們的定位差別很大接口地址空間典型用途注意事項(xiàng)fork完全復(fù)制COW通用進(jìn)程創(chuàng)建大內(nèi)存進(jìn)程下耗時(shí)隨內(nèi)存增長vfork與父進(jìn)程共享父進(jìn)程阻塞fork 后立刻 exec 的老場景子進(jìn)程不能 return只能_exit或 execclone可精細(xì)控制共享哪些資源實(shí)現(xiàn)線程、命名空間隔離參數(shù)復(fù)雜直接用的場景不多posix_spawn內(nèi)部實(shí)現(xiàn)可能用 vfork/clone單純想“起個(gè)程序”接口受限不適合 fork 后跑自定義邏輯選型上的判斷其實(shí)很簡單如果你 fork 之后馬上就要 execve那就用posix_spawn它在 glibc 里會(huì)走clone(CLONE_VM | CLONE_VFORK)省掉整個(gè)頁表復(fù)制的開銷在大內(nèi)存進(jìn)程里差距非常明顯。我在一個(gè)占內(nèi)存接近 1GB 的服務(wù)里把fork exec換成posix_spawn創(chuàng)建子進(jìn)程的耗時(shí)從毫秒級(jí)降到了幾十微秒級(jí)效果立竿見影。如果 fork 之后子進(jìn)程要跑一段自己的 C 邏輯改環(huán)境、設(shè)權(quán)限、接著算那還是老老實(shí)實(shí)fork。vfork不要碰它的約束太苛刻稍微寫錯(cuò)一點(diǎn)就是未定義行為而且現(xiàn)代 glibc 的fork已經(jīng)在很多場景下優(yōu)化得夠好了。如果你需要的是“共享地址空間的并發(fā)”那你其實(shí)想要的是線程應(yīng)該用pthread_create而不是clone。clone是給需要做命名空間隔離、實(shí)現(xiàn)容器運(yùn)行時(shí)這類底層工具準(zhǔn)備的。4.3 內(nèi)存開銷的實(shí)測感受我自己做過一個(gè)粗略的對比測試在同一臺(tái)機(jī)器上讓一個(gè)進(jìn)程分別占用 10MB、100MB、500MB 匿名內(nèi)存然后各 fork 1000 次記錄平均耗時(shí)。數(shù)量級(jí)上的結(jié)論是10MB 時(shí) fork 大約在幾十微秒100MB 時(shí)漲到一兩百微秒500MB 時(shí)到了毫秒級(jí)。這個(gè)增長主要來自頁表復(fù)制和 VMA 遍歷跟寫入多少數(shù)據(jù)無關(guān)。這個(gè)結(jié)論有很實(shí)際的指導(dǎo)意義如果你的服務(wù)常駐內(nèi)存很大就不要在熱路徑上頻繁 fork。要么改成常駐的 worker 池啟動(dòng)時(shí)一次性 fork 好之后靠任務(wù)隊(duì)列分發(fā)要么改用線程池要么在 fork 前盡量減少不必要的內(nèi)存映射。反之如果進(jìn)程很小比如一個(gè)命令行小工具fork 的開銷基本可以忽略不用過度設(shè)計(jì)。5. 常見問題與排查實(shí)錄5.1 僵尸進(jìn)程不是“沒死透”是“沒人收尸”子進(jìn)程結(jié)束后內(nèi)核不會(huì)立刻把它的task_struct全部釋放因?yàn)楦高M(jìn)程可能還需要讀取退出狀態(tài)。這個(gè)狀態(tài)叫僵尸態(tài)Z。只要父進(jìn)程調(diào)用了wait或waitpid狀態(tài)被讀取資源才會(huì)真正回收。如果父進(jìn)程一直不回收僵尸會(huì)越積越多。單個(gè)僵尸占的內(nèi)存不多主要是一個(gè)task_struct加內(nèi)核棧但 PID 是有限的數(shù)量堆上去之后新的 fork 就會(huì)返回EAGAIN。用ps aux | grep Z能一眼看到或者ps -eo stat,pid,ppid,comm | awk $1 ~ /^Z/。處理方式有幾種按場景選同步回收waitpid(pid, status, 0)適合明確知道要等哪個(gè)子進(jìn)程的場合。異步回收注冊SIGCHLD處理函數(shù)在處理函數(shù)里循環(huán)waitpid(-1, NULL, WNOHANG)直到返回 0 或 -1。注意SIGCHLD可能合并所以必須用循環(huán) WNOHANG不能只 wait 一次。主動(dòng)放棄如果確實(shí)不關(guān)心子進(jìn)程結(jié)果可以顯式忽略signal(SIGCHLD, SIG_IGN)在某些系統(tǒng)上這會(huì)讓子進(jìn)程退出時(shí)自動(dòng)被回收不用父進(jìn)程操心。但要注意這會(huì)影響到所有子進(jìn)程其他需要waitpid的地方就拿不到狀態(tài)了。#include signal.h #include sys/wait.h #include unistd.h static void on_sigchld(int sig) { (void)sig; int saved_errno errno; while (waitpid(-1, NULL, WNOHANG) 0) { /* 循環(huán)回收所有已退出的子進(jìn)程 */ } errno saved_errno; } int main(void) { struct sigaction sa; sa.sa_handler on_sigchld; sigemptyset(sa.sa_mask); sa.sa_flags SA_RESTART | SA_NOCLDSTOP; sigaction(SIGCHLD, sa, NULL); /* ... 業(yè)務(wù)邏輯 ... */ return 0; }信號(hào)處理函數(shù)里保存和恢復(fù)errno是個(gè)細(xì)節(jié)因?yàn)樾盘?hào)隨時(shí)可能打斷正在進(jìn)行的系統(tǒng)調(diào)用處理函數(shù)里如果改了errno回到被打斷的地方邏輯就亂了。SA_RESTART的作用是讓被信號(hào)打斷的系統(tǒng)調(diào)用自動(dòng)重啟減少EINTR的處理負(fù)擔(dān)。另一個(gè)容易被忽略的角色是孤兒進(jìn)程。父進(jìn)程先于子進(jìn)程退出子進(jìn)程就被“過繼”給initPID 1或者某些系統(tǒng)里的 subreaper由它負(fù)責(zé)回收。這本身不是問題但如果你的程序里子進(jìn)程依賴父進(jìn)程做清理工作父進(jìn)程一死子進(jìn)程就成了沒人管的野進(jìn)程。做守護(hù)進(jìn)程或者熱重啟的時(shí)候要特別小心這一點(diǎn)。5.2 緩沖區(qū)重復(fù)輸出一個(gè)經(jīng)典到不能再經(jīng)典的坑這段代碼把輸出重定向到文件你會(huì)看到兩行hello#include stdio.h #include unistd.h int main(void) { printf(hello); /* 沒有換行 */ fork(); return 0; }原因在于 stdio 的緩沖策略。輸出到終端時(shí)是行緩沖遇到\n才刷輸出到文件時(shí)是全緩沖緩沖區(qū)滿了才刷。printf(hello)沒有換行內(nèi)容就躺在用戶態(tài)緩沖區(qū)里沒發(fā)出去。fork復(fù)制地址空間時(shí)這份緩沖區(qū)內(nèi)容原樣復(fù)制到了子進(jìn)程。父子進(jìn)程各自正常退出exit觸發(fā)刷新于是同一個(gè) hello 被寫了兩次。這個(gè)坑的隱蔽之處在于同樣的代碼在終端上跑是正常的一重定向到日志文件就出問題。所以排查時(shí)如果發(fā)現(xiàn)“日志里怎么有重復(fù)行”先看看是不是在fork前有沒刷新的輸出。規(guī)避手段很成熟fork之前調(diào)用fflush(NULL)把所有的輸出緩沖刷干凈或者子進(jìn)程一律用_exit而不是exit或者在每個(gè)printf后面老實(shí)加\n。這三條里我推薦后兩條組合使用_exit應(yīng)該成為肌肉記憶。5.3 常見問題速查表把上面這些以及一些零散的問題匯總一下方便對著查現(xiàn)象最可能的原因排查/解決fork返回 -1EAGAIN進(jìn)程數(shù)達(dá)到RLIMIT_NPROC或 cgroup pids 上限ulimit -u查容器 pids.maxfork返回 -1ENOMEM內(nèi)核內(nèi)存不足無法分配task_struct或頁表看dmesg、/proc/meminfo子進(jìn)程跑完不退出ps顯示Z父進(jìn)程未回收加waitpid或SIGCHLD處理日志出現(xiàn)重復(fù)行fork 前 stdio 緩沖區(qū)未刷新fork 前fflush(NULL)子進(jìn)程用_exit循環(huán)里 fork 出 2^n 個(gè)進(jìn)程子進(jìn)程落回循環(huán)子進(jìn)程分支結(jié)束后立刻_exit父子寫同一文件內(nèi)容錯(cuò)亂共享文件偏移量用O_APPEND或各自 open或分文件子進(jìn)程里加鎖永遠(yuǎn)阻塞多線程下 fork鎖被其他線程持有改成 fork 后立即 exec或用pthread_atfork子進(jìn)程變成孤兒無人清理父進(jìn)程先退出用 subreaper 或?qū)iT的 supervisor子進(jìn)程繼承了不該有的 fdfd 默認(rèn)被繼承fork 后關(guān)閉無關(guān) fd或用O_CLOEXEC最后一條值得展開說一句。O_CLOEXEC這個(gè)標(biāo)志非常有用打開文件或套接字時(shí)帶上它這個(gè) fd 會(huì)在 exec 時(shí)自動(dòng)關(guān)閉避免子進(jìn)程意外持有不該持有的連接。在長連接多的服務(wù)里如果 fork 出來的子進(jìn)程繼承了所有 socket一方面浪費(fèi) fd另一方面連接關(guān)閉的時(shí)機(jī)變得難以判斷。從代碼層面統(tǒng)一給open、socket、pipe2加CLOEXEC是個(gè)好習(xí)慣成本幾乎為零。還有一個(gè)排查技巧不確定子進(jìn)程到底繼承了哪些 fd可以在子進(jìn)程里ls -l /proc/自進(jìn)程PID/fd一眼看清楚。同理/proc/PID/status里的Threads、VmRSS/proc/PID/task/下的線程列表都是排查這類問題的一手信息。養(yǎng)成看/proc的習(xí)慣比裝一堆工具快得多。6. 我在實(shí)際項(xiàng)目里攢下的幾條經(jīng)驗(yàn)寫到這里分享幾個(gè)文檔里不太會(huì)提、但確實(shí)節(jié)省過時(shí)間的做法。第一給每個(gè) fork 出來的子進(jìn)程起個(gè)可識(shí)別的名字。Linux 上可以調(diào)prctl(PR_SET_NAME, worker-xxx)這樣ps和top里就能看明白哪個(gè)進(jìn)程在干什么而不是一堆同名進(jìn)程排在那。出問題時(shí)省下來的定位時(shí)間遠(yuǎn)超當(dāng)初寫這幾行代碼的成本。第二在子進(jìn)程的入口處打一行帶 PID 的日志并且立刻setpgid或調(diào)整會(huì)話。這能讓日志里的 PID 和進(jìn)程樹對應(yīng)起來尤其是在子進(jìn)程會(huì)再 fork 的場景下沒有這層標(biāo)記日志會(huì)亂成一鍋粥。做后臺(tái)任務(wù)的時(shí)候順手把子進(jìn)程放到獨(dú)立的進(jìn)程組后面想整組發(fā)信號(hào)終止也方便。第三不要吝嗇waitpid的循環(huán)寫法。我見過太多“只 wait 一次”的代碼在子進(jìn)程密集退出的場景下漏回收慢慢積累成僵尸。統(tǒng)一寫成while (waitpid(-1, st, WNOHANG) 0)配合SA_RESTART這套模板可以直接抄。第四大內(nèi)存進(jìn)程優(yōu)先考慮換掉模型。如果發(fā)現(xiàn)每次 fork 都有明顯卡頓先別急著調(diào)內(nèi)核參數(shù)問問自己“這個(gè) fork 真的必要嗎”。預(yù)派生進(jìn)程池、線程池、獨(dú)立的常駐服務(wù)這三種方案在絕大多數(shù)場景下都比“按需 fork”更穩(wěn)。fork這個(gè)接口看著古老但它承載的語義——地址空間復(fù)制、文件描述符繼承、執(zhí)行流分叉——至今沒有被替代。把它的返回值、COW、回收機(jī)制這三件事吃透后面再看clone、看容器運(yùn)行時(shí)怎么隔離命名空間、看 shell 怎么執(zhí)行管道都會(huì)順很多。我現(xiàn)在寫涉及多進(jìn)程的代碼開工前會(huì)先在紙上畫一遍父子關(guān)系標(biāo)清楚哪個(gè) fd 誰負(fù)責(zé)關(guān)、哪條路誰負(fù)責(zé) wait畫完之后 bug 就少了一大半。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
蜜桃av综合网发布| 日本Xx性爱| 网友自拍第1页 | 97se亚洲综合自| 在线视频 亚洲精品| 国产不卡免费在线视频| 人妻少妇精品一区二区三区| 午夜福利 成人 91| 人人妻人人狠人人| 欧美视频激情久久久久久| 亚洲日韩精品一区二区| 久久99视频| 97超碰总站| 国产精品直播在线观看直播| 情色AV电影| 啊啊啊啊,啊啊好多水| 95自拍视频在线观看| 久久久精品日本一道| 亚洲色图图片| 婷婷五月天成人网| 9久在线视频只有精品| 日本色婷婷| 亚洲系列欧美| 国产精品青草综合久久| 国产欧美日产一区二区三区 - 国产欧美日 | · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 精品黑人一区二区| 后入式在线免费观看60秒| 五月天婷婷在线看| 闷骚老熟女15P| 熟妇综合一区二区三区| 人妻精品综合中文字幕在线 | 欧美狠狠鲁| 国产深夜福利| 欧美日韩亚洲高清不卡一区二区三区| 天堂v无码免费视频| 亚洲av乱伦色图网站| 91国产丝袜美女| 蜜乳AV一区| 久久九操在线观看| 丁香五月天堂网| 欧美性91| 九九热超碰97亚洲最新香蕉| 日本欧美一区二区三区免费| www.91欧美| 国产成人一级av88| 少妇人妻在线| 国产丝袜美女诱惑| 一级AV性爱| 欧美日韩天堂| 久久婷婷五月综合| 日本熟女不卡视频| 噜噜噜亚洲精品| www网站黄| 欧美国产婷婷久久| 日本东京热大香蕉a片| 中文字幕精品一区二| 日本精品性生活久久久| 国语精品内射在线观看| 国产性爱强奸乱伦大全| 狠狠爱夜夜干| www鬼畜国产男人的天堂| 亚洲无码视频免费在线观看网址! J?P?NESEHD熟女熟妇伦 | 日韩A优精品在线观看| 伊人嫩草| a片亚洲一本通视频| 亚洲精品无码少妇久久| 日语五十路和六十路亚洲国产精品| 97大色网| 成人综合色网| 可能人人看人人摸| 97在线观| 日日黄色三级网站| 日韩精品99999| 琪琪精品免费一区二区三区| 欧美 亚洲 在线| 四季AV综合网址| 日韩不卡a级视频专区| 男女激情黄色网址| 91高清欧美| 顶级少妇BT天堂| 国产AV高清AV无码| 亚洲春色欧美激情自拍| 中出欧美| 丰满人妻一区二区三区四区| 日本一线产区和二线产区伦理片| 97精品久久久久中文字幕| 99激情视频| 国产精品永久免费10000| 国产丁香精品露脸视频| 欧美韩国你懂得在线| 91久久久久久| 日韩不卡a级视频专区| 欧美色宗合| 骚熟女AV网| 欧美 日韩 国产传媒| 99性爱视频| 久久产精品一区二区三区电影| 亚洲不卡一| 天堂性色| 舔人妻中文免费视频| 国产精品一区av在线| 中文字幕国产| 熟女久久久| av情色影音| 亚洲图片 91| 大地资源在线观看中文第二页| 成人一道本免费视频| 久草成人| 亚洲欧美日韩中文播放| 色欧洲| 国产日韩中文字幕欧美| 国产人人干| 97AV在线免费观看| 蜜臀99999| 亚洲精品99| 大地资源在线观看中文第二页| 欧美黄色片在线播放| 久久九色| 超碰78| 人妻丝袜一区二区三区在线| 国产成人欧美精品在线| 97在线免费观看| 狼人狠干| 偷拍偷窥与盗摄视频专区| 人妻久久| 国产无吗在线播放| 99久久精品无码一区二区毛片免费| 麻豆精品一区二区三区四区免费观看| 亚洲图片欧美| 日韩中文字幕av在线播放| 欧美v亚洲v日韩v最新在线二区| a片偷拍视频| 性饥渴少妇av无码毛片| 亚洲国产欧美一区二区潘金莲| 国产亚洲色婷婷久久99精品91 - 百度| 亚洲九九九九| 免费的黄片有限公司| 国产成人91一区二区三区| 国产美女在线精品免费看| 天天射天天操天天干天天吃2018| 天天爽夜夜爽夜夜爽精| 大香蕉一线视频| 手机在线看片免费人成视频| 午夜免费福利视频一区| 亚洲天堂东京热| 日本裸体久久色噜噜| 精产国品一区二三产品| www.成人无码| 日韩欧美亚洲自拍偷拍| 成人av影院在线观看| 亚洲中文日韩欧美大香蕉视频| 成人A片男人的天堂| 第二页中文字幕| 欧美人妻色| 9ⅰ久久久天天| 久久久91| 国产超碰人人操| 日韩AV片| 精品人妻一区二区三区视频| 国产丁香精品露脸视频| 3P丝袜熟女 色综合| 天天日美女的B| 亚洲天天更新| 国产97av| 自怕偷自怕亚洲精品| 日韩欧美中文日韩欧美色| 日韩成人大片一区二区| 色婷婷成人综合| 亭亭在线资源| 大香蕉乱级| 你想操日本小逼吗| 青青草啪啪网| 国产精品剧情| 亚洲欧美日韩精品久久久一区二区| 色情综合网| 日日夜夜国产综合| 青青青在线高清视频在线一二三四区 | 天天性射网| 大逼色网站| 欧美成人性爱视频在线播放| 久草免费福利在线播放| av线电影| 人妻一区视频| 亚洲欧美综合网站| 亚洲男人天堂2019| 一区久久久二区| 日韩特一级久久| 日韩在线国产字幕| 天天爽爽爽爽| 亚91网| 精品中文字幕一区二区| 青草青青久久久久久国产| 91美女看B| 色哟哟 日韩精品| 99日精品欧美国产| 色臀aV| 欧美自拍偷拍综合图片| 草b在线| 亚洲丝袜少妇在线| 综合久草| 中文字幕国产在线天堂| 青青11操操操操操操操操| 日韩无码服务区| 亚洲天堂AV在线播放| 超碰亚洲97| 久久线上视频免费看| 黄片aaaaa一区| 伊人青青草久久| 人人操欧美风骚| 五月丁香啪| 999九九九九国产动| 亚洲国产精品V?在线播放| 色青青久久影视| 青青欧洲黑| 日本欧美一区二区三区视频麻豆| 2000亚洲男人天堂| 国产精品高潮呻吟av久久4虎| 夜夜一区二区| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 国产高潮AA片免费看| 久久九七| 97精品熟女少妇一区| 久久草视频污视频| 欧美大香蕉专区网| 97欧美日韩综合| 久久性爱大全| 天天摸夜夜添无码小视频| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 色悠悠伊人网五月天| 欧美顶级黄片AAAAA在线免费看| 长久操视频| 久久久免费一级黄片| 中文字幕无码不卡啪啪| 一起草AV| 国产无码精品久久久久久| 久久综合日韩亚洲欧美| 久久欲| 精品久久九| 日本中文字幕在线电影| 亚洲欧美日韩制服另类| 欧美一区二区三区黄色影视| 亚洲男人天堂2019| 一道α片欧美| 大干人妻| 中文字幕一二三区| 久久婷婷视频| 欧美一二三级精品在线| 在线观看啊啊啊啊啊| 欧美国产日韩高清在线| 男同专区一区二区三区在线| 欧美A√综合网| av资源在线观看少妇| 伊人网高清| 91av天美性媒精品视频| 中文字幕日本久久| 亚洲在线| 亚洲蜜臀精品视频久久| 久久久久久久久久久人妻| 免费观看国产不卡av| 四虎免费在线播放| 色噜噜人妻丝袜AV资源| 欧美在线官网| 亚洲美女自拍偷拍视频| 男女啪啪网站免费视频| 欧美线天码中字| 国产精品久久发布| 91精品久久综合熟女| 亚洲成a人v欧美综合天堂下载| 日本精品久久久久久久| 欧美日韩国第一区| www.99色| 婷婷色影院| 中文操逼字幕| 久久久啊啊啊| 欧美专区17页| 双插在线| 久久伊人网视频一区二区三区| 极品尤物女神在线观看| 97超碰人人模人人拍人人| 亚洲人精品午夜不卡| 久久久久久久极品香蕉视频| 日本操BAV| 2023天天操夜夜操| 永久免费观看的毛片的网站| 日夜精品| 正宗无毛一线天嫩逼| 久久香蕉超碰97国产精品| 色婷婷电影网| 亚洲色图殴美色图激情乱伦| 吖在线不卡一区二区国产剧情 | 丝袜制服字幕在线| 日日夜夜干| 四季AV综合网址| 国产少妇肉丝在线观看| 精品伊人久久久大香线蕉小说| 91制服丝袜中文字幕| 免看60秒涩涩视频| 五月天亚洲网| 曰韩少妇无码| 99re综合伊人| 亚洲综合有码| 97亚洲在线| 天天综合~91| 狠狠色伊人亚洲综合网站色| 日本精品网站在线中文| 欧美亚洲尤物久久| 超97在线精品视频| 男女性无套 免费九一| 欧美日韩亚洲天堂| 天天看夜夜看日日干| 欧美激情在线观看视频| 91爱剪切久久| 欧美性爱免费短视频| 黄色激情电影在线观看| 欧美劲爆视频一区二区| 丁香六月婷婷久久综合| 青青草在线成人视频| 国产视频一区二区在线观看| 欧美激情色婷婷花野真衣一区二区| 亚精品无码毛片一区二区三区| 婷婷九月国产| 免费试看60秒| 欧美探花网| 搡老女人老妇女AAA一VU麻豆 | 2024黄色视频| 久久这里只精品99re66图| 骚逼高潮久久精品| 99精品网站| 中文字幕免费看| 大香蕉综合网| 日韩人妻播放| 粉嫩国产精品久久粉嫩| 大香蕉琪琪日本女优不卡| 色97国产69香蕉| 国产精品国产精品国产| 草草影院日本第一页| 天天肏夜夜肏| 99热日| 蜜臀久久99精品久久久电影| 2021久久国产综合精品青草| 亚洲日韩肥臀视频在线观看| 91 综合 色| 91天天综合日韩欧美| 日韩人妻一区二区| 国产67194| 亚洲国成人情色好看电影| 国产丝袜高跟美女av免费观看| 青娱乐91| 九九综合久久| 日本最新1区2区3区| 九热中文字幕| 99热只有这里有精品| 四虎AV无码| 天天影视91看看| 日韩免费在线视频观看| 91xingse| 狠狠躁伊人中文字幕| 免费黄色片。| 91美乳| 午夜在线播放| 亚洲精品乱码久久久久久蜜桃麻豆 | 中文字幕人成乱码熟女香港| 97超碰色五月| 久操免费观看| 另类小说五月天| 翔田千里无码一区| 亚洲精品丝袜-不卡成人免费……| 女人的天堂大香蕉网| 蜜臀99久久| 九九热超碰| 久久精品福利影院| 97干在线看| 综合色图,成人综合网| 天美传媒av一区二区| 久久久久国产精品久久久| 国内毛片欧美香蕉精品| 亚洲五月丁香花狠狠干一区二区三区 | 四虎国产精品永久地址入口| 狠插 制服 自拍| 久超碰这里只有精品| 色狠狠 - 百度| 密臀在线免费观看| 午夜性生活av免费在线看| 视频分类 国内精品| 蜜臀aV午夜一区二区三区| 国产一区二区三区视频在线看| 国产日本熟女顶级一区二区三区视频| 亚洲精品少妇| 日韩在线视频1234| 插入逼91| 青青草国产盗摄一二三区| 淫荡网址| 日韩精彩免费| 新亚洲无码| 成人精品视频一区二区| www.色吧5.com| 精品乱子一区二区三区99| 美女裸体无遮挡永久免费观看网站| 色五月丁香五月| 欧美综合1性辶| www狠狠| 欧美黑人与女人91| 99国内精品| 天天综合网在线观看| 久久久精品国产亚洲伊人| 国产精品久久久久婷婷二区次| 亚洲精品三| 久热伊人| 亚洲图片欧美91N| 97亚洲综合影院| 国产伦精品一区二区三区在线观| 国产精品久久久午夜夜伦鲁鲁| 精品久久久亚洲AV成人网站| 色色97爱| 亚欧中文字幕在线视频| 26uuu偷拍亚洲欧洲综合| 亚洲性图91| 五月婷婷性爱| 午夜精品久久久久久久久久久久久| 一本一道人妻久久一区二区三区| 精品无码久久久久久久杏吧| 超碰人妻中文在线| 色婷婷影视| 美女久久久| 91少妇香蕉久久精品| 强奸乱伦Av网| 91在线视频国产网站| 91美女色视频亚洲| 午夜高清成人在线视频| 人妻精品视频一区二区三区| 97久久免费| 精品少妇一区二区三区在线视频| 偷拍盗拍亚洲色图图片| 色香伊人| 大香蕉在线视频15| 国内毛片婷婷六月色| 97超碰精品图片| 中文字幕视频在线观看一区二区| 久久久久久国产手机AV| 91色交| 九九国产| 天色综合网| 亚洲国产成人精品久久久国产成人一区二区三.| 熟妇女伦乱视频视频 | 一牛影视成人片免费| 国产剧情在线| 丰满人妻一区| 欧美超碰96| 亚洲色图大香| AAAAAAAAA黄片| 日韩操啪| 欧美瑟综合| 狠狠躁天天躁日日躁| 亚洲成人av色网| 日韩国产不卡在线视频| 欧美片第一页| 亚洲色性| 白嫩嫩一区| 亚洲色欲天天天堂色欲网女| 亚洲美女精品九九视频| 欧美三四五区| 久久草视频污视频| 人妻酒店出差被中出免费在线播放| 亚洲 综合 欧美| 日本高清有码网址视频| 不卡一区二区日本视频| 日韩啊V| 97超碰色情| 亚洲中文字幕av | 韩国女主播青草福利视频| wwwcaobibi| 97人妻免费中文字幕| 免费久久一级毛片大黄| 中文久久| 中文字幕精品探花视频| 男人天堂东京热| 国产激情在线| 久久久久久十| 欧美色91| 九九九久久久W精品| 天天操天天7| 风骚少妇视频中文字幕| 青青伊人这里只有精品| 国产精品高潮久久AV| 91偷拍欧美亚洲| 91麻豆天美国产欧美日| 婷婷人妻激情| 亚洲猛交| 青青操在线视频| 国产精品日日摸天天碰| 天天综合网~91| 亚洲激情在线| 好爽免费视频| 中文字幕精品免费一区二区| 免费一级性爱久久| 国产男女边吃边摸视频网站| 欧美亚洲色图另类国产| 欧美日韩另类在线播放| 少妇人妻太紧太深av| 国产 热久久久久国产精品| 日韩99精品视频综合区| 97国产高清视频在线观看| 国产亚洲精品农村妇女| 国产超碰| 九色97| 狠狠躁AV| 欧洲自拍色图gif在线| 国产免费久久精品99re韩国| 亚洲se电影| 97伦综合| 五月天我淫我色av| 性做久久久久久久| 九九热超碰| 国产精品肉丝自拍| 97欧美色综合| 天美麻豆一区二区三区| 国产粉嫩蜜臀av一区二区三区| 丰满人妻区一区二区三| 欧美性生活男人的天堂| 国产亚州高清国产拍精| 超碰人人在线| 传媒免费一区二区三区| 夜夜欧美| 丰满人妻一区二区三区性色| 综合色99| 久久中出在线| 天天干夜夜操一区二区| 视频一区二区三区精品| 日日噜噜夜夜狠狠视频无| AAAAAAAAA黄片| 五月天婷婷激情| 人妻天天爽夜夜爽精品2| 日韩精彩视频| 啪啪性爱免费视频| 国产成人在线观看综合| 天天综合香 ld视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 亚洲日产专区| 天天内射| 久久精品国产精品一区| 久操不卡视频| 欧美视频第二页| 国产欧美另类久久久精品课程| 免费αV在线视频| 色婷久久| 人妻少妇久久中文| 色哟哟 日韩精品| 日本日皮视频逼| 99热综合| 亚洲91射| 亚洲日韩美国人妻| 麻豆天美久久91| 女人18精品一区二区三区| 国产一区二区免费福利片| 国产懂色精品国产av| 四虎免费看黄| 狠狠操使劲操| 67914亚洲精品| 欧美肥臀在线| 国产精品黄色三级av| 国产精品久久久久绯色| 日韩97| 欧美视频在线视频免费va| 男人的天堂VA在线| 久久只有精品| 九九精品美女高溯喷水| 中国特猛少妇色xxx| 日韩欧美tv一区二区在线观看| 国产精品制服丝袜中文字幕日韩一区二区三区| 91熟女丨91老女人| 国产 丝袜 欧美中文 另类| 国产精品久久久999| 高清孕妇孕交| 国产伦精品免编号公布| 91肉丝| 国产成人网址| 中文字幕视频在线观看| 大香蕉伊人久久| 台湾大香蕉99热| 欧美日韩狠狠爱| 色就色综合| 婷婷伊人| 97久久久久| 人人透人人操| 欧美人妻制服| 啪啪91| 亚洲欧美色图片| 欧美日韩m| 激情五月天中文字幕色| 日韩99999色| 国产福利一区二| 动漫片子网站3黄| 老司机深夜18禁污污网站| 日日干夜夜操视频h| 日韩熟女三十乱伦| 丰满搜索结果 -第18页- 久久高清无码| 国产呦精品系列在线观看| 96AV精品| 69少妇一区二区| 亚洲天堂美臀在线| 精品一区二区人妖| 东京热毛片177b2viP| 素人播放一区| 最新国内自拍av免费| 在线亚洲丝袜视频网站| 欧美成人一区二区三区在线播放| 欧洲亚洲人妻无码高清久久三区四区| 香蕉在线一区二区三区| yiqicaoav| 青青草成人视频在线观看二区| 男女激情黄色网址| 欧美日韩中文字幕不卡| 亚洲熟妇熟在线电影视频| 96AV精品| 中文字幕黄片在线| 污电影在线观看| 337p大胆噜噜噜噜噜91Av| 综合色一区三区二区| 欧美页片| 丰满岳乱妇一区二区三区| 亚州高清AV| 青青草吊丝| 麻花传媒免费网站在线观看| 91日产桃蜜| 精品熟女一区=区三区| 日本成人A片网站| 久久精品人妻一区二区三区| 男人的天堂在线有码| 这里只有精品视频在线观看麻豆| 亚州精品人妻一二三区| 亚州乱码中文字幕综合久久久| 欧美日韩操操操| 黄页网站成人免费| 99热亚洲天堂| 无码人妻丰满热妇又大又粗| 青娱乐老司机视频| 天天综合网视频91| 91天天综合网,天天综合网| JULIA一区二区三区在线播放| 欧美在线天堂| 大香交| 精品人妻一区二区乱码一区二区 | 超碰91在线| 亚洲欧美另类图片| 国产一级137片内射麻豆| 91操熟妇| 97超碰免费生活| 老熟女熟妇| 婷婷色色网| 亚洲午夜福利视频| 日韩操逼HD| 性天堂| 清纯唯美激情| 欧美日韩不卡传媒| 一区,二区,三区视频| 久久久久骚| 五月丁香六月激情| 久久亚洲AV无码专区国产精品| 欧美大波激情xxxx| 国产400孕妇孕交群| 91N综合网在线| 强奸熟女一区二区三区| 东北女人| 97 亚洲 日韩 欧美 在线| www.99热| 婷婷五月天综合网| 粉嫩av在线一区二区| 国产51色综合久久免费| 人人艹亚洲| 欧美日韩国产一区二区小黄片大全| 91高潮| 熟妇色99| 日日不卡av| 少妇天堂| 女生91网站| 日本性一区| 天堂精品一区| 精品无人区麻豆乱码1区2区图片| 粉嫩少妇自慰在线| 午夜福利区| 中文字幕超碰CAO| 国产精品交换一区二区| 久久国产三区| 夜夜爽妓女| 九月婷婷综合| 超碰人人乐97| 九一综合精品视品av| 日本三级中国三级99人妇网站| 日韩成人网址| 欧美后进式| 亚洲国产精品久久久久婷婷青年| 日韩人妻资源网| 久久久9视频| av操操不卡| 国模不卡一本二本三电影| 青青青艹在线视频| 97视频在线免费| 亚洲91射| 大色综合| 色就色综合| 夜夜天天噜狠狠爱2021| 一起草精品人妻| 天天日夜夜| 中文伊人大香蕉视频| 91亚州欧美| 国产精品在线一区二区| 狠狠干2020| 久久精品—区二区三区内射| 日韩免费福利在线观看| 午夜一区二区三区国产| 亚洲av无码成人精品国产| 99久久久无码| 精产国品一区二三产品| 神马九九九| 好属操| 97精品一区二区视频| 久操网线| 久久精品视频久久久| 日韩在线人妻网站| 综合熟妇一区二区三区| 在线视频免费观看午夜| 黄色av网站在线播放| 自偷自拍的亚洲视频| 青青草久久一区网| 制服丝袜第二页| av网站免费看| 日韩,欧美,中文在线| www.狠狠干.coom | 久操在97| 久久少妇| 日本在线观看网址| 欧亚免费视频| 亚洲精品国产精品乱码不卡| 久久精品国产亚洲粉嫩| 日韩精品在线放| www.色五月| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 欧美精品99久久久| 99在线观看无大码| 狠狠爱夜夜| 亚洲国产奇米影视久久| 久/久精品99看9| 久久 亚洲 日韩 人妻| 午夜在线播放| 日本免费专区| 欧美一区二区三区大综合| 国产精品另类一区大香蕉| 精品人妻一区二区三区日产乱码| 久久夜黄色无码A级大片| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 久久久91| 极品白嫩美女白浆成人福利在线看| 亚洲男人bt天堂| 久久久性少妇| 大香网站| 男人的天堂亚洲| 超碰欧美COM| 一级啊性爱在线视频| 人人澡人人弄| 成·人免费午夜在线观看| 欧美日韩性爱精品| 欧美性五月| 思思热久久成人| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 精品一区二区麻豆| 国产亚洲色停停久久99精品91| www.zbzhongsen.com| 99精品人人爽| 国产成人久久精品蜜臀| 久久精品三级影视| 国产第二页| 金莲网址| 亚洲偷拍欧美激情| 蜜乳AV.COM| 9久久美女首页| 欧美日韩大黄片| 黑丝少妇麻豆| 日本αv| 亚洲综合码| 九九碰九九爱97超| 裸体美女免费看网站青草| 久夜操| 婷婷五月天成人| 精品少妇一区二区| 99热精品在线| 丰满人妻一区二区三区| 96国产精品| 99性爱视频| 亚洲色91| 青青草久久一区网| a片偷拍视频| 农村妇女精品一区二区| 欧美亚洲尤物久久| 熟女露脸激情自拍视频| 国产午夜无码片在线观看影视| 午夜精品久久久99热蜜桃的功能特点| 8050无码八戒| 自拍第一页| 婷婷五月色| 免费精品无码一级毛片牛牛影视 | 26uuu国产| 丝袜综合网| 久久欧美1卡2卡3| 亚洲精品国产精品成人| 久久国模av| 屁屁影院一区二区三区国产| 欧美综合777| 超碰免费在线| 亚洲伊人久久综合97| 97色妞| 95自拍视频在线观看| 国产中午字一暮区| 国产精品一二三免费网站| 亚洲欧洲成人在线电影| 久久精品老司| 最新国产精品久久精品| 偷拍亚洲| 亚洲永久AV无码精品秋霞| 欧美人妻一区| 久久人妻| 五月天欧美色图| 五月婷婷激情综合| 自拍偷拍 日韩欧美| 欧美青青草视频| 狼天天狼天天大香蕉| 亚洲日韩精品久久久久一区壹牛| 伊人久久亚洲色欲综合网站 | 国产人妻久久精品一区二区三区| 中文字幕在线免费观看视频| 精品综合久久久久久五月天| 国产欧洲精品亚洲午夜拍精品| 女优免费一区二区永久| 豆花视频操逼网址| 亚洲综合在线91| 99蜜桃臀亚洲成人在线观看| av国产无码| 亚洲av噜噜噜噜噜噜| 国产中文日韩欧美一区二区三区人妻丝袜美腿 | 夜夜高潮夜夜爽夜夜爱爱一区| 亚洲国产综合久久天堂| 99在线无码精品秘 入口黑人| 躁躁躁日日躁2020| 91美女視頻| 97视频在线观看播放与子乱对白在线……| 国产成人99久久亚洲综合| 91精品久久久久| 欧美一级专区免费大片| www.夜夜| 色欲日韩欧美在线一区| 老司机深夜18禁污污网站| 少妇熟女一区二区三区| 亚洲限制级| 久久久久久久久久久久久久久性生活视频| 狠狠色噜噜狠狠狠狠狠色综合久久| 亚洲做性| 久9久精品视频| 日韩天堂av电影在线观看| 国产免费一区二区在线A片视频| 日韩极品无码B| 97爱爱爱| 亚洲男人的天堂va亚洲男人社| 91碰碰| 97爱亚洲综合色| 嗯啊免费视频| 五月丁香影院| 成人免费在线网站| 97人人操人人摸| 欧美1区二区三区公司 | 丰满欧美放荡少妇在线| 性色av一区二区| 久久天天躁日日躁狠狠躁| 久久思思热| 婷婷导航| 26uuu欧美| 99自拍视频| 国产一区二区av综合| 国产精品女久久久久av爽| 国产野战露脸在线播放| 美女天天干| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 大香伊人在线一区| 夜夜操av亚洲一区二区| 九九九九九九九九九九九免费国产| 久久久成人国产精品无码| a级成人毛片免费视频高清| 日本操大逼| 青青伊人这里只有精品| 亚川综合视频| 欧美一级久久久久久久大片动画| 亚洲囯产精品女人久久久| 搡老熟女免费视频| 国产无码久久高清| 69少妇一区二区| 狼狼色丁香久久婷婷综合五月| 亚洲日韩精品久久久久一区壹牛| 久久精品国产亚洲5555| 欧美色图综合| 蜜臀久久99精品久久久| 好吊色青靑草| 超碰九7| 亚洲欧美综合| 嗯嗯不要视频| 人妻激情视频| 后入式999| 少妇精品久久久八区九区| 操淫穴亚洲五月丁香 | 九九九综合精品| 4141514逼喷水三级片| 操我啊啊啊啊啊| 99999精品成人| 色婷婷综合久久久久中文一区二区 | 巨爆乳一区二区爆乳区| 精品一区二区人妖| 综合操逼| 好吊妞转入那个网| 日本精品国产视频| 9ⅰ久久久天天| 亚洲资源吧| 人妻精品视频一区二区三区| 少妇一区二区三区高速| 国产树林里野战在线看| 久久婷五月| 国产超碰在线一区| 国产自偷| 精品少妇高潮久久| 日本欧美中文字幕| 久草网站免费在线观看| 中文字幕一区av| 九九热超碰| 激情终合网| 78m啪啪啪| 五十路六十路七十路熟婆| 免费1级a做爰片观看| 久久精品三级影视| 日本天堂网| 九九九只有精品| 欧美欧美少妇| 精品无码不卡视频| 亚洲天堂综合AV| 囯产精品强| 欧美久久人体| 中国AV美女| 99激情视频| 青青三级视频| 97超碰中文在线| 国产高清26uuu| 艳美熟妇先锋一二三区| 亚洲区限制级 99| 91P0RNY大屁股人妻| 亚洲综合中文字幕有码| 校园春色综合色| 一区二区三区看视频| 免费αⅴ在线观看| 九九热超碰| 九九九九97| 欧美日韩黄片精品在线| 人妻天堂综合网| 91超级碰碰| 久久蜜色情在线视频xxx免费观看| 人妻精品免费一二三区| 亚洲性高潮| 激情小说激情视频| 热热色综合网| 午夜精品久久99蜜桃的功能章节| 神马久久午夜| 亚洲国产美女久久久久| 天天插夜夜操| 91成人久久 | 97超碰色| 久久精品国产亚洲AV嘿嘿| 在线观看亚洲成人精品| 亚洲免费在线探花| 色欲天天综合网| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 在线观看综合精品亚洲| 99999精品成人| 亚洲激情深爱文学小说网站| 国产午夜精品一区二区三区牛牛| 色色毛片| 韩国黄色片精品久久久| 天美一二三在线观看Av| 全国男人天堂网| 国产精品又黄又猛又粗| 亚洲福利中文字幕在线| 午夜久久一区二区无码中出| 亚欧美色图| av网站在线观看了| 亚州色交| 狠狠入| 婷婷综合| 在线电影亚洲色图| 亚洲色系另类精品国产| 欧美婷婷| 欧美高清16| 激情AV| 国产精品毛片| 91小视频| 欧美亚洲激情一二三| 亚洲春色一区二区三区| 这里有精品| 天美久久久久| 久久久一区二区三区麻豆| 国产欧美在线观看免费观看| 九九综合色| 国产精品高朝久久久久久久| 伦激情人妻另类人妻| 亚洲另类久操网| 欧美日韩欧美| 色色国产| 香蕉综合网| 婷婷久久综合| 91精品网站| 欧美毛片在线网| 91精品国产91综合久久蜜臀| 一区二区三区免费岛国片| 欧美九一精品久久久熟妇| 婷婷操逼| 天堂v无码免费视频| 欧美精品久久| 91操碰| 日韩欧美性爱电影在线观看| 欧美大香蕉97| 亚洲精品国产精品乱码不99| 视频二区美腿制服人妻欧美| 黄色二级片网站| 电家庭影院午夜69久久夜色精品国产69乱| 97干色天堂| 中文字幕在线高清男人的天堂| julia国产在线| 骚逼一区二区| 超踫中文字幕| 久久黄色视频一区二区三区 | 久草免费在线一区二区| 91肉丝| 夜夜嗨TV| 午夜无码熟妇丰满人妻| 中文字幕91综合| 国产精品一二三在线看| A级国产欧美激情在线| 欧美淫乱视频| 欧美狠狠操| 狼天天狼天天大香蕉| 亚洲色图亚洲无码强奸乱伦| 很很操在线| 欧美天天射| 亚洲熟女乱综合一区二区三区| 99r九九| 精品久久久久9999| 亚洲宅男天堂| 一本久道久久综合狠狠爱| 狠狠综合| www.婷婷| 国产欧美亚洲精品a第2页| 天天激情干| 制度丝袜99| 日韩无码精品综合久久| 亚洲麻豆av一区二区| 91色婷婷综合久久中文字幕二区| 99这里只有精品| 97在线观| 91东北熟女| 日韩偷拍一区二区三区| 天天激情综合站| 中文字幕高清精品一区| 久久精品国产亚洲AV高清演员表| 国产极品粉嫩馒头一线天av| 久久久少妇| 国产精品人妻熟女aⅴ| 操高情无码| 91狠狠综合久久| 中文字幕加勒比海高清无码免费视频| 四虎影库国产精品免费| 99热在线不卡| 97精品一区二区视频在线观看| 青青久久艹| 中文字幕天堂在线| 人人爱人人操人人性| 一区二区偷拍拍视频| 97干色天堂| 欧美性高潮在线| 一级做a爰片久久毛片图片| 永久免费发布性爱网| 大香蕉碰碰| 国产亚洲性生活视频播放| 免费A V在线播放| 亚洲色欲一区二区三区| 色九色久| 精品午夜福利国产一区二区在线观看| 国产精品国产拍高清AV| 久久久中文版| 男女啪啪网站免费视频| 性爱乱伦网址| 亚洲色婷婷久久91| 色吧综合网| 精品无码久久久久| 明星性猛交ⅹxxx乱大交| 欧美日韩99| 色综合久久夜色精品国产天堂| 日本精品999| 中文字幕国产精品1区| 久久久久久久久九九久孕交| 中日韩久久久| 超碰97久久| 校园春色之综合网| 午夜亚洲| 夜夜嗨一区二区| 91无遮挡| 日韩偷拍色图| 久久久久久9| n1038 一二三区| 一级AV性爱| 欧美后进式| 亚洲乱码尤物193YW| 中文乱码字字幕在线第5页| 久久久禁| 神马久久网| 欧美日韩222| 日韩性爱毛片操骚逼| 香蕉欧美| 九热中文字幕| 日韩欧美加勒比| 日韩在线国产字幕| 噜噜噜噜久久久精品免费| 特级大荫道BBwBBwBBW| 99日免费视频中文字幕| 国产啊v在线免费播放| 综合色播| 中出后入| 性在久久久久久| 91久久青青草原精品| 欧美日韩国产精品久久色婷婷| AV色天香在线| 欧美性天天影视| 欧美综合区| 偷拍盗拍亚洲色图图片| 亚洲情色 自拍| 狠狠97| 夜色97| 日本九九久久99播| 综合色99| 超碰成人国产| 日韩欧美午夜视频在线| 国产三级片在线观看| 日韩欧美天堂| 青草园大香蕉| 99久久无色码| 免费一级视频特黄色大片| 一区二区三区免费岛国片| 69av一区二区三区| 欧美激情1区| 色97干| 九久精品| 999久久久国产精品| 97国产精品久久久久 | 尤物av网站免费在线播放| 日本一区不卡| 99re免费| 欧美在线91| 成人小说另类在线|