日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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的接口簡(jiǎn)單到幾乎沒有任何可配置項(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í)慣編譯器對(duì)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)核對(duì)象。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的場(chǎng)景浪費(fèi)極其嚴(yán)重——復(fù)制了一大堆馬上要被覆蓋的內(nèi)存。寫時(shí)復(fù)制Copy-On-Write簡(jiǎn)稱 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í)行流、競(jìng)爭(zhēng)與繼承那些課本上不講清楚的事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注冊(cè)的函數(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ù)制的是描述符不是文件對(duì)象。父子雙方各自的 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。這是最安全的姿勢(shì)execve會(huì)把整個(gè)用戶態(tài)地址空間換掉鎖的狀態(tài)也一并消失。絕大多數(shù)“fork 后要干事”的場(chǎng)景其實(shí)都該走這條路。fork 之前保證沒有其他線程在跑比如在程序啟動(dòng)早期就把需要 fork 的邏輯做完。用pthread_atfork注冊(cè) prepare/parent/child 三個(gè)鉤子在 fork 前后手動(dòng)加解鎖。這套機(jī)制能解決問題但很容易寫成死鎖尤其是涉及多把鎖的時(shí)候加鎖順序稍不注意就翻車。提示如果你的程序用了線程池同時(shí)又有 fork 子進(jìn)程的需求請(qǐng)優(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ò)是很多人對(duì)“子進(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)對(duì)了。想支持管道就需要在 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)碼、壓測(cè)腳本里特別常見。#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)存壓力??梢杂胹ysconf(_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í)需要申請(qǐng)內(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 的老場(chǎng)景子進(jìn)程不能 return只能_exit或 execclone可精細(xì)控制共享哪些資源實(shí)現(xiàn)線程、命名空間隔離參數(shù)復(fù)雜直接用的場(chǎng)景不多posix_spawn內(nèi)部實(shí)現(xiàn)可能用 vfork/clone單純想“起個(gè)程序”接口受限不適合 fork 后跑自定義邏輯選型上的判斷其實(shí)很簡(jiǎn)單如果你 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)在很多場(chǎng)景下優(yōu)化得夠好了。如果你需要的是“共享地址空間的并發(fā)”那你其實(shí)想要的是線程應(yīng)該用pthread_create而不是clone。clone是給需要做命名空間隔離、實(shí)現(xiàn)容器運(yùn)行時(shí)這類底層工具準(zhǔn)備的。4.3 內(nèi)存開銷的實(shí)測(cè)感受我自己做過一個(gè)粗略的對(duì)比測(cè)試在同一臺(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/。處理方式有幾種按場(chǎng)景選同步回收waitpid(pid, status, 0)適合明確知道要等哪個(gè)子進(jìn)程的場(chǎng)合。異步回收注冊(cè)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 常見問題速查表把上面這些以及一些零散的問題匯總一下方便對(duì)著查現(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)程樹對(duì)應(yīng)起來尤其是在子進(jìn)程會(huì)再 fork 的場(chǎng)景下沒有這層標(biāo)記日志會(huì)亂成一鍋粥。做后臺(tái)任務(wù)的時(shí)候順手把子進(jìn)程放到獨(dú)立的進(jìn)程組后面想整組發(fā)信號(hào)終止也方便。第三不要吝嗇waitpid的循環(huán)寫法。我見過太多“只 wait 一次”的代碼在子進(jìn)程密集退出的場(chǎng)景下漏回收慢慢積累成僵尸。統(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ù)場(chǎng)景下都比“按需 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
返回資訊列表
精品人妻15区| 五月天大香蕉| 日曰骚久久精品| 99综合网| 色综合av男人天堂| 九九九九免费高| 亚洲高清无码免费观看视频| 特级特黄一级毛片免费| 67914在线兔费成人视频| 国产农村妇女精品一| 美女午夜福利免费视频| 福利视频网站| 污电影在线观看| 99天堂网| 狠狠色噜噜狠狠狠狠狠色综合久久| 亚洲欧美综合图片| 蜜臀99999| 日本韩欧美在线播放a| 97超碰美女| 国产美女91视频| 亚洲超碰AV| 亚州欧美色图| 亚洲中字慕不卡| 欧美九九99久久精品| 人妻在线视频| av中文在线| 国产AAAAAABBBBB| 怡红院久久老司机| 另类图片五月天| 丰满翘臀美女影院视频| 精品少妇一区二区三区免费观看| 亚洲成人美女无吗| 啪啪综合网| 夜夜嗨一区二区三区三州加勒比| 青青三级视频| 天天影视网色欲色香| 人妻在线臀日韩| 亚洲国男人的天堂| 亚洲免费97免费| 成人精品视频一区二区| 久久99手机免费视频| 天天综合网久久ww| 久久久久久久国产| 国产 大胆 对白| 台湾大香蕉99热| 综合网~91综合网| 亚洲美女30b| 亚洲综合在线高清| 99re3这里只有精品| 伊人久久88国产女| 99999久久久久9国产精品| 色婷婷综合网| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 青青操在线视频| 欧美线天码中字| 国产精品69久久久久久久| 玖玖综合视频| 干超碰碰熟女| 91亚洲色人| 人妻日日干| 日本熟妇人妻中出视频| 美女诱惑爱爱| 久插综合| 4虎在线视频| 亚洲中字慕不卡| 33044男人的天堂深夜备| 丝袜美腿校园春色| 欧美日韩青操| 亚洲伊人青青草| 老鸭窝成人| 国产精品国产精品国产| 一起草日韩| 国产精品亚洲美女久久久久| 一道本东京热加勒比一区二区三区 | 五月天久久婷婷亚洲| 亚洲素人网| 啊啊啊水好多| 蜜臀AV秘一区翔田千里| 五月丁香影院| 国产乱弄免费在线视频。| 欧美精品三区| 人人妻人人玩人人澡人人爽| 淫骚熟女一区二区三区| 操老熟女AV| 秘书高跟黑色丝袜国产91在线| 91久久久老司机| 精品国产乱码久久久影院| 国产精品网址| 91九九九馒头| 国产精品丝袜在线| 亚卅熟女乱色| 欧美性爱一区二区三区四区 | 日韩欧美性吧婷婷乱伦大香蕉| A V视频日本| 欧美美女自慰一区二区三区| 中文子幕一二三| 日本人妻丰满熟妇久久久久久| 五月天丁香婷婷综合网站| 9九九九九视频在线观看| 最新9久久久9免费视频| 国产精品无套内谢| 91黑丝美女| AV中亚| HEYZO高无码国产精品227| 久久夜色一区二区| 麻豆亚洲AV成人无码久久精品| 日本1区2区不卡视频| 日韩啪啪啪啪啪| 五十路人妻在线| 国产传媒av天美传媒在线| 欧美顶级黄片AAAAA在线免费看| 国产欧美日韩在线不卡第一页| 日韩ab网| 亚洲高清在线se| 97精品免费视频网站| 男人的天堂一区三区| 亚洲综合性感在线| 99re这里只有精品9| 久久综合国产精品国产| 吉川爱美98堂在线| 亚洲伊人a线观看视频| 香蕉在线一区二区三区| 偷拍综合网| 九九热精品| 快播电影网日韩新片| 亚洲少妇中文字幕网址| 男人成人黄色视频在线观看免费下载| 秋霞曰韩R级| 中文字幕av片| 六月天婷婷| 欧姜老司机| 久久久久久无码人妻中文字幕| 熟女这里只有精品6| 天天弄欧美| 免费视频在线一区二区不卡| 香蕉一区二区三区在线视频| 日本成人A片免费看| 美性中文综合网| 久久精品国产99精品亚洲蜜...| 天天弄欧美| 久久精品福利影院| 日日噜噜夜夜久久亚洲一区二区| 最近的最新的中文字幕视频| 亚洲天天自拍| 按摩中文字幕| 美国人人操人人操| 亚洲女优有码无码高清| 天堂av2019| 欧美一级AAAAAAA| 日本九九久久99播| 丁香九月激情| 欧美日韩另类在线播放| 欧美肥臀在线| 日韩精品三区四区| 国产日产精品久久快鸭的功能介绍| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 国产黄a三级三级三级av在线看| 青草成人免费视频一COm| 久久国产成人精品国产成人亚洲| www鬼畜国产男人的天堂| 人人摸.人人色| 久久精品无码不卡| 97欧美精品综合| 欧美成人一级免费电影| 超碰国产精品久| 国内毛片四区| 四虎视频在线观看| 亚洲中文字幕av| aa片毛片| 色偷偷2020免费视频播放| 男人的天堂2010| 亚洲啪AⅤ永久无码| 五月天精品| 日韩中文字幕熟妇人妻| 人人爽天天爽| 国产版a级片直播在线| 激情小说亚洲| 亚洲激情久久久伊人综合| 大香蕉在线视频重口味毛片在线| 9 9精品一区二区三区| 天堂69亚洲精品中文字| 免费中文综合精品| 国产白丝精品在线观看| 麻豆色约约| 97国产亚洲中文在线| 国产67194| 国产又黄又粗的视频| 亚州,欧美在线| 三上制服丝AV| 清柠毛片| 亚洲国产一区二区三区在线| www九九热| 久久久久久电影| 亚洲阿v天堂在线| 亚州性色| 国产精品久久久久久久久久久久久久| 久久精品一区一起草| 麻豆婷婷成人一二三| 99激情视频| 91色婷婷综合久久中文字幕二区| 国产精品久久久久无码A√| 少妇久久久久久久| 日本一区二区亚洲综合| 亚洲加勒比久久日本道| 白丝被操91| 夜夜性| 大香蕉伊然在亚洲91| 亚洲 欧美 小说| 欧美性,亚州色| 97 亚洲 日韩 欧美 在线| 久热这里| 欧美综合自拍成人自拍第二十页| 欧美黄片视频在线观看免费 | 色五月激情综合网| 99热精品在线| 国产原创自拍| 欧插网站| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚州,欧美在线| 亚洲图片偷拍欧美| 91美女在线观看| 97免费视频在线| 免费视频一二三区| 欧美第一页| 韩国三级一线观看久| 精品免费视频国产一区| 欧美日韩免费性爱| 亚乱色| 91精品无码人妻系列| 中文字幕av乱伦| www超碰| 日本熟妇一区二区三区| 丝袜无码a片| 亚洲性少妇| 日韩av电影网站| 久久有码视频| 午夜成人爽爽爽爽A片李冰冰| 亚洲密乳AV| yellow网站免费观看日韩高清无码| 美國A片| 91精品大奶人妻| 久久久久久亚洲精品不卡人乳| 日韩AV一区二区三区四四| 射丝袜高跟鞋99| 欧美91在线+|+欧美| 国模久久在线| 中文字幕丰满人妻日本| 强奸乱伦αv片| 亚洲男人天堂2019| 亚洲欧美综合网站| 人人操人人色网| 天天色黄色影院天天操| 五月婷婷性爱| 男人天堂网手机版婷婷| 97天天综合| 一本久道在线综合视频| 六月婷婷激情| 色欧洲97| 6080YYY午夜理论片在线观看| 欧美日韩国内不卡| 国产又大又粗又长视频在线| 2017天天插| 小日子操bb在线看| 狼天天狼天天大香蕉| 精品无码一区二区人妻久久蜜桃| 立川理惠被中出无码 | www被窝色com| 人人妻碰人人免费| www99热| 亚洲涩涩| 先锋影音av先锋一区| 午夜国产成人福利视频| 亚洲色图欧美另类在线| 强奸乱伦免费网站| 国内91熟女人妻丝袜天天精品视频在线| 刺激精品视频| 2024黄色视频| 深爱激情五月天| 综合色拍| 中文字幕国产| 最新av在线| 国产精品人妻一区二区| 人人操天天爽| 亚洲激情片| 蜜乳av首页| 91久久国外网| 国产欧美日韩精品中文| 黑人精品久久97| 五码视频在线观看| 操逼精品视频| 美国日韩黄片| 日韩99神马视频片| 一级乱伦网站| 精品十三区| 翔田千里无码一区| 操操操操操操| 国产精品久久天天干| 天天综合网国产| 亚洲色图欧洲| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 日韩综合色图| 国产11页| 亚洲欧美洲综合| 九九干| 97天天弄| av影片在线观看不卡| 人人干人人搞人人摸| 美女骚尻视频| 欧美视频在线视频免费va| 日韩精品操少妇| 国产一进一出视频网站| 久久熟女久| 秋霞一级A片黄色视频| 中文字幕日韩人妻视频一区二区三区交换夫妻| 日韩欧美大力操| 偷拍在线观看视频| 8050午夜少妇无码| 九九草| 欧美色棕合| 欧美黄色手机在线观看| 一级黄碟| 9久久精品| 香蕉人欧美综合| 麻豆AV一区二区| 亚洲一区操| 五毛骚逼极品美女怕怕| 九九aV| 久久精品久久久久久久| 97这里都是精品| 黄色网址在线免费观看| 99re欧美| 麻豆伊人网| 人人射人人操人人摸| 中国91AV| 免费人人搞97| 日本欧美国内在线| 国产强奸乱伦欧美| KK色在线影院| 欧美亚洲影视| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 91天天c| 日本韩欧美在线播放a| 精品一区二区三区国产| 97在线观看免费| 欧美熟女少妇| **一级毛片国产| 肉动漫无遮挡h在线观看| 国产日韩在线播放av| 一本大道青青| 综合天天网| 激情五月天网| 日韩欧美经典在线观看| 一区不卡在线观看av| 91精品丝袜久久久久久| 综合色拍| 三级片大波波| 国产精品交换一区二区| AV免费在线播放一区| 激情综合网亚洲| 久9综合在线| 欧美日韩少妇色情| 久久久99久9| 天美麻花大全视频| 黄片免费久久久久久久| 国产成人91一区二区三区| 久草电影网| www.高清无码诱惑一区.com | 99热91| 欧美强奸乱能| 精品九九国产无码| 久久国产逼| 成人性生活高清视频在线播放| 五毛骚逼极品美女怕怕| 美女AV一区二区| 不卡码视频| 婷婷久久五月天| 人人色人人操在线| 操逼网站地址| 大香蕉黄色一区| 女人 A一级| 四虎视频在线观看| 蜜伊人色综合97| 天天综合色电影| 色综合天天| 日本福利二区视频| 国产呦精品一区二区三区下载| 日韩黄色av中文字幕| 亚洲欧美色图小说| 成全在线观看免费观看| 岛国网址国产| 丰满人妻一区二区三区四区| 93人人操人人| 免费在线黄片视频| 亚洲精品国产熟女久久久久久| 久久久久亚洲av综合波多野制衣| 四虎国产精品永久地址入口| 亚洲天堂AV在线播放| 人妻少妇被猛烈进入中| 中文字幕日韩人妻视频一区二区三区| 亚洲囯产精品女人久久久| 再深点灬舒服灬太大了添视频| 久热精品在线国产| 青草青草久热| 亚洲精品三| 九九九九九九九精品视频| 精品夜夜澡人妻无码| 夜夜高潮夜夜爽高清视频一| 青青草视频久久久久| 国产91精品久久久久久久网曝门| 午夜福利在线合集| 五月天精品| 丝袜AV一区二区三区| 2023天天操夜夜操| 日本在线激情一区二区三区| 韩国一区二区精品亚洲| 国产60区。| 日逼国产| 欧美国产日韩清纯唯美| 欧美激情片一区二区| 青青三级视频| 亚洲久久久久| 日韩A优精品在线观看| 综合色啪| 国产精品亚洲四五区在线观看| 日韩中文字幕2020| 91日韩网站| 亚洲 小说 欧美 激情 另类| 这里都是精品在线观看| 在线天堂999| 亚洲素人网| 欧美色性情| 8x福利精品第一福利视频导航| 婷婷激情五月天小说网| 国产a级精品| julia ann久久| 99999精品| 人妻精品一区二区在线| 久久超碰亚洲人| 久草线上视频免费看| 人妻丝袜美腿中文字幕| 久久久无码av精| 久久久一热在线播放| 国产情色第一第二页在线观看| 俞拍久久国应视频| 国产亚州高清国产拍精| 欧美国产一区二区三区麻豆传媒| 日本综合色图| 国产精品青草综合久久| 亚洲综合 欧美| 1000部熟女视频在线观看| 色5月婷婷| 日韩电影天堂视频一区二区| 18禁在线视频| 后X久久| 日1区2区3区2020| 久久黄色性爱视频| 久久综合中文国产| 狠狠操狠狠操操| 超碰国产在线| 大香蕉人妻久久| 青娱乐国产精品| 欧美三级免费伊人| 秋霞 色色| 嗯啊不要啊在线| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 91综合在线| 好爽要喷了| AA特级绝黄| 日韩操呦呦影院在线观看| 三级日本一区二区三区| 超碰在线人妻不卡| 久久国产熟女影院| 国产午夜视频| 国产久久成人| 天操老女人| 欧美日韩色综合网| 极品久久久久久久久久久久久久| 人妻 中文 日韩| 天美传媒Av在线| 蜜乳AV.COM| 国产精品久久久777| 久久久久久久伊人精品| 伊人一区二区三区| 国人欧美精品一区二区| 久久久精品九| 色丁香五月婷婷| 国产精品乱码久久久| 欧美做爰无码A片视频| 伊人久日| 欧美日韩国产在线| 日本久久女同性恋视频| 欧美亚洲20p| 亚洲国产奇米影视久久| 日韩97精| 美女刺激久久国产欧美| 日韩免费av片高清无码| #NAME?| 日韩成人大片在线观看| 一区二区三区机械有限公司| 97干色天堂| 狠狠久久手机视频精品| 午夜福利在线视频1000| 亚洲第一精品在线视频| 亚洲色欧| 九九九综合精品| 天天做日日做| 欧美日韩狠狠爱| 顶级少妇BT天堂| 久久社区一区二区三区| 97日韩欧美亚洲| 操久久久久久| 国产精品4p在线观看| 色制服丝袜夫妻av一区| 秋霞一级视频在线观看免费| 国产h小视频在线观看免费| 一区二区 日韩 欧美 国产 传媒| 国产精品自拍欧美在线| 午夜啪| 免费超碰97久久| 亚洲丝袜色| 欧美性生活免费网| 91精品国产一区三一| 国产精品第二页| 婷婷九月| 中文操逼字幕| 啊啊啊啊嗯嗯在线久久久| 嗯嗯嗯啊啊啊操的我好爽 | 99re国产精品视频| 精品九九九九九九| 91精品婷婷国产综合久久| 九九热九九热| 久久久久9| 久久欲| 91老司机精品| 欧美色图亚洲色,麻豆| 91日日| 亚洲宅男天堂| 久久美女福利是上海美女| 四虎国产精品永久在线囯在线| 亚洲免费人妻在| 亚洲欧美国产中文视频| 亚洲情色 自拍| 日韩亚洲97| 一区二区三区四区久久视1| 91黑丝在线播放| 秋霞曰韩R级| 三级AV入口| 亚洲综合第一页| 日韩精品一二三| 欧美成人精品一区二区男人蜜臀| 小明看看网址| 亚洲色图国产另类| 97人亚洲综合字幕| 欧美色66| 国产精品制服丝袜中文字幕日韩一区二区三区| 欧美一级三级| 这里只有精品久久| 亚洲少妇色| 91麻豆天美国产欧美| 五月天丁香网| 日本福利社| 九九热最新| 99热精品在线观看| 五月天婷婷欧美三区| 丁香六月婷婷久久综合| 9+1视频网址| 激情婷婷| 东北黄色电影| 91色综合激情| 加勒比日本在线| 91激情网| 欧美激情黑人| 蜜桃天美传媒AV一区二区三区| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 九九九久久久久| 欧美婷婷久久| 亚洲精品黑丝| 亚洲视频精选| 国产亚洲99久久精品熟| 成人AV超碰免费在线| 夜夜嗷嗷一区二区| 人妻内射一区二区在线视频| av日韩中文字幕| 天天天干977| 国产女人视频三四五区| 亚洲精品一区二区精品| 91精品人妻电影| 操操碰| 久久理论字幕视频| 日日日骚女人精品| 殴美色网| 亚洲不卡三级手机播放| 岛国视频免费在线观看| 丁香五月婷婷五月| 曰本熟女视频| 91网站18+| 亚洲日韩天堂| 黄色网址在线免费观看| 志村玲子视频一区二区| 麻豆一区二区三区精品| 日韩91网| 狠狠操官网| 亚洲成av人片色午夜乱码| 好淫网一二三视区| 亚州欧美综合| 国产在线观看一区二区三区| 国产精品自在线发布| 伊人AAA| 久草在| 欧美激情1区| 午夜.DJ高清在线观看免费7 | 超碰97首页| 国产97视频| 亚洲天堂7777| 九九久久国产精品| 久热这里只有精品9| 国产精品人人爽人人做可爱福利| 狠狠色综合网| 99精品高潮| 日本淫乱女一区二区三区视频| 日本精品无码三级网站| 九九精品美女高溯喷水| 国产97av| 國產尤物AV尤物在線觀看| 欧美 综合| 97在线看| 婷婷激情五月综合| 中字一区| 无码高清国产AV| 五月久久HDAV| 亚洲国产综合图区中文字幕| 日韩性爱高清免费视频| 欧美伦乱爱| 亚洲欧美一区二区网址| 人人人人人人少妇| 色九九久九九| 熟妇操花| 亚洲 国产 精品一区| 欧美一二三区四五区| 九九九九九精品| 久久XX| 夜夜春夜夜操| 亚洲操逼视频网站| 亚洲情色综合网| 一级片在线观看高清无码| 蜜桃精久三区| 色色色日本| 无码一区二区三区四区五区六区七区八区九区十区视频 | 久草免费福利在线播放| 欧美色图成人网一区二区 | 欧美传媒一区| 超碰在线观看av不卡| 黑人中出21连凳花野真衣| 中文字幕欧美日韩三级| 91亚洲精品青草| 精品久| 国产怡红院| 天天噜| 日本一区二区电影网站| 国产在线视频午夜精华在| 夜夜嗨AV一区天天| 国产高清成人免费视频| 超碰久久中文| 日韩字幕一区| 人妻人人澡人人爽人人| 亚洲欧美综合区自拍另类| 蜜臀th| 国产在线视视频有精品| 伊人性在线视频| 婷婷综合网| 四虎精品永久在线播放| 天天日天天射天天干| 欧美日产国产在线成人第一区| 亚洲宗合网| 色狠狠综合| 青青草国产欧美非洲黑人| 91啦人妻| 蜜桃久久精品一区二区三区| 国产懂色精品国产av| 亚洲情色 自拍| 精品91摸| 夜嗨影院| 欧美亚洲91| 久久婷婷亚洲欧| 精品国产精品一区二区| 国产粉嫩蜜臀av一区二区三区| 久久中出在线| www.色婷婷色综合| 香蕉欧美| 热热色综合网| 91黑丝少妇| 美国日韩黄色片| 九九九网站| 嗯嗯啊好大| 9久热| 久久天天艹| 蜜汁欧美| 麻豆天美传媒在线视频天堂| 精品人妻美妇91job| 日韩性爱长视频免费| 人妻熟女一区二区| 宅男91视频在线播放| 日美免费黄片| 豆花视频操逼网址 | 亚洲高清无码AAA久久久精品| 欧美亚洲情色| 亚洲成人在线资源| 97超碰资源网| 国产欧美一区二区| 亚洲欧美经典一区二区 | 1204av韩国| 6080yy午夜理论三级一区二区三区无码| 亚洲成aⅴ人片不卡无码| 嗯嗯啊啊啊好爽| 99国内熟女露脸视频| 九九热免费在线国产视频伊人五月| www色日本| 黄片色区软件| 亚洲国产欧美一区二区潘金莲| 精品999一区二区| 91精品久久久久久77777| 少妇天堂网络| 蜜臀精品1区2区| 婷婷五月天成人| 日韩欧美经典在线观看| 视频二区熟女人妻| 久久做97| 欧美天天综| 超碰公开久久网| 日韩人妻资源在线看| 婷婷丁香成人| 日本在线视频导航| 久久一级无码精品毛片6| 国产日韩欧美操逼视频| 国产精品一区二区手机看片| 欧美色涩| 国产97色在线| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 夜夜爽33333| 中日韩欧美精品无码AⅤ一区二区| 成人无码在线超碰网| 香蕉视频欧美一卡二卡| 69精品| 欧美性色欧美| 天天干人人乐| 亚洲猛交| 狠日欧美| 99re视频在线播放青草| 神马麻豆福利院| 天天色综合影视网| 午夜在线播放| 天天天干977| 欧美色图综合网| 日韩欧美中文字幕搭讪巨乳美人妻视频| 人妻美腿丝袜日韩| 啊啊啊啊在线观看网址| 啊啊啊不要啊啊受不了了视频在线| 91丨九色丨熟女高潮| 九热视频| 一区在线观看中文字幕| 自拍偷拍2025在线观看| 91久久99久久91熟女精品| 蜜乳av首页| 九九九九久久久| 九九99久久| 亚洲 中文 女同| 1024亚洲中文字幕久在线看片你懂的| 夜夜操老骚逼视频网站| 亚洲欧美九九九| 麻豆精品天美| AV男人天堂网| 男人天堂新| 欧美成人性活片| 国产精品麻豆成人av| av天天在线| 射丝袜大香蕉| 色狠狠一区二区三区香蕉| 91色色网站| 亚洲欧美色图小说| 尹人免费观看视频在线| 国产成人精品无码久久| 国产传媒午夜理伦精品| 日本一区二区不卡精品| 婷婷丁香熟妇综合网| 91亚洲黑人| 天天肏夜夜肏| 中文字幕片| 欧美成人精品一区二区男人蜜臀| 日韩在线电影| 中文字幕一区电影在线观看| www.色操逼| 日本97久久久精品| 中字一区| 欧美高清18A片| 强奸乱伦Av网| 久久不卡一区二区| 91超碰碰在线| 97碰| 偷拍 欧美 日韩| 熟女视频久久| 97日视频| 日本男人天堂| 亚洲 日韩 丝袜 熟女 变态| 色色激情五月天| 亚洲一本色码中文字幕| 亚洲,欧美,综合网| 爽极品影院| 五月天激情婷婷| 五十路人妻在线| 亚洲激情视频| 国产亚洲精品自在线亚洲情侣| 日本精品国产视频| 台湾佬大香蕉| 亚洲国产麻豆一区二区三区| 日韩97超碰中文字幕| 天天干1区2区在线| 夜夜草天天| 99这里只有精品| 九九九九欧美| 国产亚洲精品A在线观看下载| 国产AV高清AV无码| 色香伊人| 国产精品久久久久久照片| 夜夜嗨一区二区| 国产丁香精品露脸视频| 精品欧美А∨无码黑人大荫蒂| 色色色色色色色色色色色色色色综合| 久久久精品中文字幕麻豆| 欧美18 在线观看| www.狠狠| 精品夜夜澡人妻无码AV| 亚洲色图日韩精品| 欧美极品少妇| se吧提供91精品国产91久久久久久| 欧美99热| av橘色网站| 无码高清专| www被窝色com| 偷拍三区| 欧色性第一页| 国产最新小视频在线播放下载 | 亚洲色综网| 性做久久久久久久| 成人在线午夜视频一区| 国产性爱乱伦AV| 日本99一区二区| av绯色| 91AV天美在线视频| 久久国产乱子伦精品免费女人| 久久精品72| 26uuu国产亚洲综合| 粉嫩AV一区夜夜嗨| 免费观看网黄| 精品小视频在线| 日韩小电影| 欧美日韩理论一区| 九月丁香婷婷色| 清清草影| 国产精品香蕉热久久新品| 97超级色碰碰| 99综合| 熟妇激情| 人妻少妇色综合| 天美传媒婬乱| 亚洲不卡不卡中文字幕不卡| 国产第12页| 丁香婷婷激情五月天无毒不卡 | 久久久蜜桃一区二区三区| 亚洲在线欧美| 精品免费1| 欧美一区二区三区另类精品| 久久综合av| 九九99精品视频在线观看| 深夜福利黄片| 99xav| 日韩av一级黄片| 五月天久久人妻| 嗯嗯啊啊用力视频免费| 中文精品一区二去| 亚洲日精品| 天天干天天日天天射黄色| 看免费一级在线播放毛片| 99在线啪| 色色五月天婷婷| 国产精品久久久久无码Av网曝门| 日本伦理一区二区| 特级丰满少妇一级AAAA爱毛片| 久久免费9| 国产精品视频电影| 人、人、摸,人、人、草| 亚洲色图日韩丝袜制服一区二区五月在线| 日韩伦理久 久久 清纯| 久久这里是精品| 亚州性9| 1024午夜激情男人的天堂| 日本中文字幕在线电影| 天天视频网站黄| 少妇蹲下买菜露大唇0| 欧美在线伊人色| 成人精品在线| 男女做爰猛烈动高潮A片免费应用| 亚洲国产蜜臀系列在线观看| 殴美,日韩国产伦精品| 口爆吞精在线观看| 嗯嗯啊啊操我| 97久久超碰亚洲| 美女AV一区二区| 九九热精品| 欧亚性爱视频免费看| 色吧 综合| 東南亚性呦成人伦理资源在线视频| 亚洲色资源| 亚洲一区二区三区麻豆传媒| 99热官网| 美国一区二区免费视频| 1级午夜影院费免区| 日本亚洲嫩草影院啪啪| 久久精品91| 97超级欧美| 美女露胸露尿口| 婷婷五月花| 欧美亚洲另类在线蜜桃| wwwxxx日本爽| 亚洲AV麻豆Aⅴ无码电影一| 欧成人在线| 91精品少妇搡搡搡| 亚洲欧美国产中文字幕| 少妇500双飞99| 久久熟女人| 婷婷色在线| 婷婷五月天成人| 综合操逼| 另类小色呦| 国产乱人伦AVA麻豆软件.| 婷婷伊人五月| 国产精品高潮久久久无码| 欧美色蜜桃97| 青青草原av| 夜夜嗨一区| 亚洲drav色图| 久久久久人| 五十路人妻在线| 欧美亚洲厕所精品偷拍91| 日韩无码AB| 天天碰操中国年青熟妇| 亚洲自拍欧美国产首页网曝| 九九九九日本 | 老熟女乱子伦中文字幕一区二区| www.av家庭乱伦| 天天看精品动漫视频一区| 97视频免费播放| 97超碰色情| 日韩在线观看三级电影| 欧美性暴力| 国产偷人伦激情在线观看| 日韩无码一级黄色av片| 日本欧美中文字幕| 成人一道本免费视频| 欧美成熟性爱精品| 日韩人妻播放| 日本精品第一视频在'| 成视频在线观看免费看| 一区二区激情国产熟女 | 亚洲欧洲第二视频在线观看色图| 成人老鸭窝人人在线视频| 欧洲小说色图视频另类| 中文字幕av一区二区三区人妻少妇| 欧美综合 站| 亚洲男人天堂网站| 秋霞色色影院| 99亚洲国产精品色一区二区三区| 亚洲一曲日韩精品| 夜色AV无码手机在线影院| 六月婷婷色综合| 日韩美女久久一区二区三区| 欧美中文字幕一区| 男女香蕉一区二区| 91精品人妻一区二区三区蜜桃| 久久久久久久9| 岛国免费黄色网址| 综合久久六月久久婷婷| 人妻久久久久久久久久久久久久久| 亚洲城人男人的天堂| 四虎免费看黄| 超碰导航97| 极品肉射| 婷婷av在线中文字幕| 亚洲无码久久久久久久| 久久婷婷五月综合| 少妇人妻精品| 九九九九热只有精品| 亚洲国产综合视频| 在线观看精品国产免费| 久久久久国产亚洲一区欧美色图日韩| 97超碰色屌| 亚州欧美另类| 亚川综合视频| 四色永久成人网站| 日夜干射色啊| 国产9l 大屁股| 中文字幕亚洲热播人妻| 久久99黄色卞西瓜| 中文字幕诱惑制服人妻丝袜美丝袜美 | 91黑丝美女| 日本Suv精品一区二区| 先锋影音av先锋一区| 婷婷五月天AV| 亚洲日韩乱码中文无码蜜桃臀网站| 99国产精品| 久久精品性| 久久久不卡区一区二区三区久久久| 人妻激情视频| 久久毛卡| 欧美日韩国产电影| 日韩小电影| 色婷视频| 超碰中文字幕人妻草一区| 亚洲丝袜在线观看| 手机看av网站在线看| 亚洲国产精品久久久久久久久久| 欲色啪| 鸡巴插逼视频| 久久9精品视频| 精品国产乱码久久久久久网站入口| 欧美顶级黄片AAAAA在线免费看| 日本九九久久99播| 国产精品第一页国产大屁股视频免费区| 久久AV无码网址| 91精品丝袜久久久久久无码人妻| 亚洲色图 欧美| 天天爽夜夜操| 十八禁电影伊人网| 第四色奇米影视777| 人妻嗯啊啊在线播放| 夜夜免费视频| 久久久久久久国产视频| 无码人妻精品一区二区三区九九| 91在线免费精品视频| 99久久com免费视频′| 淫荡网址| 日韩精品区二区三区不卡| 超碰色97| 中文字幕在线观看丝袜| 久肏视频字幕| 婷婷伊人网| 久久亚洲日韩熟女精品| 玖玖爱免费观看视频| 久久久一区二区| 亚洲欧洲日韩国产自在线| 97一区二压| 久干9操| 青青草一区二区三区四| 成人七区| 高清不卡 中文 人妻| 人人摸人人叼| yazhouzaixian| 91丨九色丨国产打屁股| 亚洲丨在线| 99碰碰| 麻豆天美传媒毛片| 中文字幕制服欧美久久一区| 欧美激情久操网| 日本999精品视频| 亚洲欧洲综合成人av一区| 97超级欧美| 国产精品视频白浆免费| 亚洲欧洲综合| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 久久人妻| 91人妻丝袜无码| 日本不卡高清视频| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | www.av在线视频| 老司机午夜福利视频一区二区| 欧美黑人精品一区二区| 国产农村妇女毛片精品久久| 99啪啪| 天天射天天| 日韩二区三四区五区六区在线看| 夜色AV无码手机在线影院| 美女9118禁| AV丝袜少妇| 午夜福利1区2区3区| 九九人妻| 精品人妻1237| 色成人Www精品永久观看| 亚洲 中文 欧美 日韩 在线| 亚洲欧美精品一区天堂久久 | 9+1视频网址| 高清国产无码av| 欧美 日韩第一性色| 日韩一级二级| 日韩乱伦影音先锋| 精品九九九九九| 亚洲色图 综合| 天天爽夜夜操| 亚洲精品国产熟女久久久久久| 亚洲色交| 欧美第一页| 国产一区二区三区不卡手机在线| 国内毛片欧美香蕉精品| 亚洲一区制服诱惑| 老熟女91av| 色播综合| 国产精品高清2021在线| 天天操妹子| 激情视频一二三| 91精品大奶人妻| 2017人人操,人人摸| 精品一区二区三区丰满熟女-亚洲欧美一区| 91成人社区| 夜夜操2028| 久久性爱大全| 伊人专区一区二区三区| 97中文字幕一区| 一区二区三区色综合| 欧美三级一级| 一级啊性爱在线视频| 性天堂| 青草精品视频一日本久久久久网站| 97频视在线| 91人人看| 成人 日韩欧美一区| 日韩精品永久在线观看| 波多野结衣之双飞调教在线播放| 国产中文字幕曰本毛片| 久噜噜| 久视频在线观看| 色色丁香| 国产原创剧情在线丝袜 | 另类TS人妖一区二区三区| 熟女人妻一区二区三区免费看 | 自拍丝袜美腿人妻| 亚洲少妇色| 婷婷综合| 亚欧Av| 久久性爱网站| 无码丰满熟妇一区二区浪潮AV| 日韩免费在线观看不卡| 91欧美色| 国产精品久久泡妞网站| 91制服丝袜| 天天操天天7| 色香综合天天影视综合 | 国产suv精品一区二区四| 精品久久視頻在线| 日本日皮视频逼| 天天躁日日躁AAA片李宗瑞| 日本精品高清一二区一本到| 亚洲国产ⅴ高清在线观看| 亚洲成aⅴ人片不卡无码| 日韩偷拍一区二区三区| 91性高朝久久久久久久久| 另类图片天天影视| 日躁天天爽爽| 欧美激情一区| 欧洲色综合| 国产精品午夜AV完会免费| 操91| 精品国产一区二区三区久久久蜜臀 |