国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成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í)慣編譯器對(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簡稱 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注冊(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)存壓力。可以用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í)需要申請(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í)很簡單如果你 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
返回資訊列表
国产成人精品一区| 亚洲熟女乱综合一区二区三区| 男人高清无码一区二区| 97超碰超欧美。| 久久91视频| 日本在线激情一区二区三区| 日本一区二区三区精品| 97 色综合| 激情综合五月| 精品国模无码| 天天搞在线综合网| 国产精品福利视频| 成人久久精品| 秋霞视频一区二区| 精品国产av一区二区三区四区入口| 亚洲天堂性爱| 99久久精品无码一区二区| 熟妇无码视频三区| 福利偷拍视频-中文字幕2019国语完整视频大全-S91AV | 四虎精品一区| 亚洲男人天堂2012| 中文字幕在线高清男人的天堂| 欧美伊人电影| 亚洲少妇激情一区二区三区| 999狠狠综合| 囯产操逼片| 91这里只有精品| 日日日大屁股骚女人精品| 国内精品不卡无毒99999| 国产免a费看黄片在线| 777超碰| 欧美日韩夜夜| 骚乳在线| 人妻少妇久久久| 欧美激情视频一区二区三区不卡| 又大又长又粗又爽又黄| 欧美 精品国产制服第一页| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 婷婷久月| 中文字幕在线观| 台湾佬大香蕉| 一区二区不卡免费| 超碰9 7女人 | 亚洲欧综合另类无码一区| 久久精品一区二区| 蜜臀99久久精品久久久懂爱| 99无码狠狠久久| 国产视频大全| 91劲爆| 欧美在线干| 亚洲丝袜二区在线| 中文子幕一二三| 搞中出视频在线观看| 99成人| 久草视频分类在线| 久久999久| 色狠狠色| 久久国色天香香蕉| 一区二区不卡| 公司1区2区3区精产精| 日本天堂网| 99re3这里只有精品| 97干天天| 老司机香蕉久久久久| 老熟女91视频| 新亚洲无码| 精品亚洲一区在线观看| 26uuu欧美日韩| 丰满人妻一区二区三区免费 | 久久国产精品视频| 亚洲精品97| 国内毛片无遮挡国产| 亚洲天堂在线怕怕视频| 十八禁视频网站| 中文高清一区二区的| 久久久久久久久久久人妻| 亚洲综合性网址| 中文字幕乱碼在线| 日本性一区| 亚洲中文字幕一区二区| 青椒国产97在线熟女| 日韩性爱毛片操骚逼| 国产AV超爽| 人人妻人人操人人乐| 久久久久久波多野吉衣高潮| 九九碰九九爱97超碰| 无码丰满熟妇一区二区浪潮AV| 午夜高清成人在线视频| 久久免费精品96| 亚洲综合在线第一页| 天天日天天搞天天干| 中国大陆国产高清AⅤ毛片| 99热99色| 东京热不卡视频| 精品91日日夜夜超清资源| 精品人妻中文字幕4399| 久久性爱城| 人人操天天爽| 色色九区| 国产又黄又粗的视频| 爽 好舒服 无码刺激久久| 动漫片子网站3黄| 麻豆人妻偷人精品无码视频| 超碰免费97| 国产色呦呦| 精品区9| 天天弄欧美| 91天堂| 国产乱伦视频污| www激情| 欧美在线啊啊啊 | 久操免费观看| 久久老子无码午夜伦不卡| 97色涩| 国产强奸乱伦第1页| 国产精品网址| 欧美亚洲天天| 欧美很很操视频| 久久精品噜噜噜成人看免欧美大片| 久久久久久日韩| 亚洲欧洲精品成人| 日韩97在线| 女人被添高潮免费视频| 久久中文字幕女同性恋一区| 亚洲av无线观看| 国产视频第2页| 精品人妻一区二区视频| 97碰碰日本乱偷人妻中文的| 吖在线不卡一区二区国产剧情| 欧美最婬乱婬爆婬性视频 | 男人天堂导航| 岛国色情视频在线观看| 男人天堂 天天射| 不卡一区二区日本视频| 欧美激情亚洲情色| 18一区二区三区| 久久激情婷婷| 丝袜综合| 日韩成人精品视频自拍| julia国产在线| 久久精品性| 天天综合网在线91| 伊人久久大香线综合无码| 嫩呦国产一区二区三区AV| 国产第二页| 92午夜免费福利视频| 午夜经典| 久插综合| 天天干夜夜一操| 欧美亚洲清纯| 粉嫩少妇自慰在线| 4399成人黄A片| 亚洲风情在线观看| 亚州综合AⅤ| 国产三区免费在线观看| 97精品久久| 97色涩| 三级三久久线久久99久目本WW| 久久一区二区蜜桃| 在线不欧美| 久久精品亚洲婷婷| AV综合中文字幕干| 国产三区免费在线观看| 91在线视频国产网站| 男人天堂综合| 久久草草欧美精品| 性久久| 九九九久久久W精品| 人妻天天爽夜夜爽精品2| 视频不卡中文字幕| 狠狠操夜夜| 免费亚洲国产精品久久一区| 欧美最婬乱婬爆婬性视频| 操久久久久| 偷拍自拍在线视频观看| 四虎在线观看网站| 素人美腿视频网站| 国产麻豆一级精品视频| 色原狠狠天天天| 色婷婷蜜臀av| 亚洲骚女一区二区三区| 极品尤物在线观看| 神马久久久久久伦理片| 亚州综合网| 妇女乱色二区| 麻豆精品天美| 大香蕉 222| 99综合视频| 97视频在线播放| 丝袜天堂网| 天天弄欧美| 大香蕉啪啪啪| 欧美很很操视频| 免费在线观看国内色片网站网址| 一级毛片久久久久久久女人18| 97 色综合| 日本黄色天堂| 精品一国2| 性生活无遮挡纯毛片在线看| 青青草伊人久久| 日日夜夜干| 午夜高清成人在线视频| 全球成人中文在线| 无码高清操逼| 综合网天天| 超碰碰97资源站| 97色欧洲| 天干天干天干天天做| 午夜精品人妻二区三区| 97精品久久久久中文字幕| 中文字幕亚洲欧美在线不卡| 欧美熟妇操操视频| 殴洲老熟女| 97 超碰 人人做 人人爱| 人妻天天爽夜夜爽精品2| 精品福利视频| 操一区| 中文字幕人妻色偷偷久久皮 | 97超碰这里只有精品| av东京热男人的天堂| av一区二区三区四区五区久草臀| 欧美A√综合网| 嗯嗯啊啊好疼| 黄页网站成人免费| 91强在线播放| 风月影院男女十八禁| 亚洲欲| 日本 情色 1区2区3区| 亚州Av天美传媒| 欧美综合狠| 97精品人妻一二三四| 超碰天天去日穴| 精品国产乱码久久久久久久久久毛片 | 日韩小电影| 亚洲欧洲激情卡通另类文学四射小说网站| 又大又大又大又粗爽高潮观看| 色欧洲| 老子午夜伦不卡影院| 欧美劲爆第一页| 亚洲天堂热| 五月大香蕉| 丁香五月婷婷基地| 成人a大片在线观看| 草草影院最新网址| 高树玛利亚无码流出| 国产熟女| 国产熟女无套内射| 强奸乱伦AV网站| 欧美国产伊人久久久久| 亚州情色j区| 夜夜嗷嗷一区二区| 97综合网| 精品国产久热在线观看| 欧美性后入| 骚妻少妇精品性色无码四色A V| 久热伊人| 国产亚洲美日韩Aⅴ中文字幕无码成人| 中文字幕成人| 噜噜噜亚洲精品| 91色香| 青椒国产97在线熟女| 9+1视频网址| 亚州高清色综合| 国产精品一区二区密臀| 国产精品熟女丝袜一区二区| www.av不卡中文字幕| 国产日韩精品suv| 干婷婷综合网| 东京热av男人的天堂| 熟妇人妻精品一区二区| 国产福利小视频高清在线观看| 97超碰jingpin| 欧美中字不卡| 亚洲日本激情| 超碰国产情侣自拍网| 久9爱精品| 26uuu国产日韩综合在线观看| 色综合91| 欧美国产精品久久九九| 色五月亚洲| 大香蕉日亚洲日本亚大| 乱伦日本色图AⅤ| 色91综合网| 久久一区二区三区四区五区| 色呦呦、国产精品| 日韩有码 一区二区三区| 99热9| 欧美精品亚洲精品日韩传电影| 少妇高潮流水av免费| 性色生活片久久毛片婬片免费放女人一级毛片 | 乱性AV| 日韩精品三区四区| V A在线| 天天看少妇| 亚州一区二区| 九九精品美女高溯喷水| 日韩一级欧美一级国产一级台湾| 理论久久婷婷网 8| 骚人妻少妇视频| 欧美日韩性爱电影在线| 亚洲一二三| 欧亚性爱在线视频| 亚洲日韩XXX| 老司机老司机午夜影院| 加勒比少妇AV婷婷六月天超碰超碰| 奇米四色网| 欧美日韩婷婷中文| 黄色av一区二区在线| 国产深夜福利| 97爱欧美| 欧美另类综合久久| 青女偷拍网| 国产精品大香蕉| 九久9精品| 欧美久久九九| 欧美日韩另类在线| 亚洲se电影| 色五月婷婷中文字幕| 少妇的嫩逼图片| 亚 欧 美 综合| 国产精品人妻一区二区| 欧美日本不卡| 97色冈| 人人操人人操人人人操| julia国产在线 | 午夜无码精品免费看性色| 一本大道青青| 日韩伦理久 久久 清纯| 国产精品成人福利在线| 九九九不卡| 97久精品| 日韩精品 视频一区二区| 亚洲在线观看| 久久一留热品黄| 无码操逼网| 国产路线专区| 美女诱惑一区| 亚洲中文日韩精品| 精品日韩| 亚洲人妻久久久| 91久久精品国产| 国产日韩欧美亚洲精品95| 骚日日av| 天天干夜夜肏| 亚洲码和欧洲精品激情系列| 日韩中文字幕在线视频观看| 最新av中文字幕高清| 91 亚欧| 国语av最新自产拍在线观看| 色婷婷五月天| 伊人影院在线理论播放| 思思热免费在线视频| 欧美一区二区| 嫩草影院永久在线制服丝袜| 久久国产精品91| 亚洲欧美日韩精品久| 综合久久少妇中文字幕| 99操逼| 婷婷精品国产一区二区三区日韩| 人妻嗯啊啊在线播放| 欧美性巨大╳╳╳╳╳高跟鞋| 欧美精品三区| 欧美色偷偷| 欧美色蜜桃97| 91美女国产在线| 欧美中字二区| 国产天天骚| 天天干,夜夜爽| 日韩精品在线观看网站| 丰满岳乱妇一区二区三区| 精品蜜乳AV免费观看| 国产白丝网站| 亚州黄站| 91热| 中文字幕三四五区| 婷婷性网| 欧美日韩在线小说| 久久αⅴ| 久久精品久| 97久久国产精品女不卡| 久久女人| 日本中文字幕不卡视频| 日韩一级欧美一级国产一级台湾| suv精产一二三区| 91色亚洲| 尤物av网站免费在线播放| 国产传媒一区二区三区| 黄片www视频免费| 999精品久久久久久久| 东北女人高潮视频| 三久久久四久久久久| 九九无码| 亚洲无码com| 日本孕妇一区二区视频操逼免费看 | 国产精品97视频| 欧美在线电影| 亚洲资源站| 91丨人妻丨国产丨丝袜| 北约熟女超碰| 一区二区娱乐网站| 亚洲天堂东京热| 99999精品视频| 久久久熟妇熟女国产| 欧美性色综合网| 精品97久久综合| 99re免费| 亚洲性爱乱操x| 岛国片在线播放| 九九久久一区二区伦理| 婷婷色导航| 日韩pv中文| 久久精品免费| 一二视频神马久久传媒| 鸥美极品| 午夜噜噜噜| 思思久热在线精品66| 国产精品美女久久久久AⅤ国产馆| 乱伦av麻豆| 亚洲精品美女久久久久久久久| 久久久婷婷婷| oumeizonghese,www| 无卡一区=区| 久久东京热久久| 国产精品免费1区2区视频| www..com操老师| 九九99精品视频在线观看| 爱爱60秒免费视频| 久久↗↗| 亚洲在线网站| 4399成人黄A片| 东京成人一区| 99综合自拍| 亚洲少妇自拍中文字幕懂色| 亚洲精品国语在线播放| 91丨九色丨国产打屁股| 97爱b| 日韩大香蕉AV影片| 乱伦图av| 国产大片精久久久久久| 午夜视频久久久| 日韩免费av片高清无码| 人妻啊啊人妻啊| 欧美论理片| 国产中出内射一区二区| 极品色社| 91高清日| 3P乱轮视频| 啊啊啊啊啊操我视频| 91丰满| 可以在线观看AV的网站| 久久免费精品96| 男人天堂网址| 六六久久日韩不卡| 精品人妻一区二区免费看| 亚洲一欧洲中文字幕在线| 爱干爱射网啊啊啊| 欧美91变态| 丰满人妻av一区二区三区| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 精品一区二区麻豆| 亚洲无码视频免费在线观看网址!| 91九九| 久久久性少妇| 激情综合二| 97综合国产| 人、人、摸,人、人、草| 久久人妻少妇| 三级三级三级a级全黄三| 美骚妇av高清在线| 国产一级137片内射麻豆| 日韩超碰精品综合| 中文字幕一区二区免费在线| 大香网伊人久久综合网eew| 久久av无码| 91 丝袜在线| 色在线视频导航| 香蕉一区二区三区在线视频| 人人么人人操| 亚洲第一二区另类图| 亚洲电影中字一区二区| 久久精品亚洲东京热色播| 色视频蜜乳| 日韩国产十八禁| 日韩 国产 欧美自拍| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 久久的网站啊啊啊啊啊| 四虎午夜影院| 一本久久精品中文字| 国产操操日韩三级黄| 加勒比综合a∨| 无码乱人伦中文视频| 亚洲精品蜜桃久久久| 91精品大奶人妻| 久久免费9| 久久这里都是精品| 亚洲免费在线探花| 精品无av| 久久久9品一区二区三区| 国产精品一区二区手机看片| 久久久久9| 中文字幕亚韩| 探花精品 一区二区| 嫩草影院永久在线制服丝袜| 中文字幕在线高清男人的天堂| 亚洲区 欧美区| 美女的肌被草喷水视频| www久| 一级黄色性爱裸体视频| 欧美青青草视频| 国产欧美日韩女同性恋ww喷水精品| 久草尤物| 天天欧美| 九九热在线精品视频| 水野优香在线观看| 网页导航五月天免费一二三区| 欧美激情区| 天天综合网AV91| 99免费在线视频| 综合国产影视三级| 欧美色乱| 欧美丝袜美女电影一二三四区| 大香蕉碰| 美国日韩黄色片| 亚洲欧洲日本精品中文a∨| 人妻少妇无码| 少妇极品熟妇人妻无码| 丁香五月AV| 特级毛片特黄久久免费看 | 精品国产自在在线99| 日韩成人大片一区二区| 成人av影院在线观看| 夜夜躁狠狠躁日日躁av| 蜜桃视频啊啊啊啊| 麻豆一区在线| 久久久99久9| 国产亚洲色婷婷久久99精品91| 国产成人无码a| 东京热天堂网| 无马一区二区| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 亚洲欧洲偷拍一区| 国内三级自拍小视频在线观看| 澳门黄片一香蕉视频| 伊人麻豆传媒| 免费在线视频97| 久久国产精品视频| 日韩特一级久久| 中文字幕精品乱码| 日韩精品大香蕉伊人在线| 啊啊啊好舒服好爽啊啊啊视频| 一区二区三区精品黑丝白丝酒店对鸡| 国产 三级自拍| 国产精品蜜乳AV| 中文字幕奈奈美被公侵犯| CCYY草草影院地址入口| 26UUU欧美日本| 精品无码秘 人妻一区二区| 91制服丝袜中文字幕| 3P丝袜熟女 色综合| 国产乱码久久久| 91精品久久久久久| 亚洲黄色| 九九九九国产| 一区二区三区美女超清| A一区片| 影音先锋每日最新资源在线观看| 大屁股人妻女教师撅着屁股| 操逼大黄片| 蜜乳AV一区| 老司机老司机午夜影院| 色欲日韩欧美在线一区| 久久九色| 欧美日不卡| 夜夜狼人妻| 亚州 综合 色图| 日本新免费二区三区| 91操人| 亚洲图片 欧美电影| 亚洲在线a| 国产真乱mangent| 被男人添B超爽视频| 国产日韩欧美亚洲精品95 | 亚洲AV在线资源| 欧美后入式| 国产精品剧情| 国产精品熟女九色九色蜜臀| 免费综合亚洲中文| 熟女一区二区三区四区| 全国男人天堂网| 国产成人亚洲精品无| 综合国产影视三级| 秋霞视频一区二区| 日本天堂网| 后入式视频国产自| 日躁天天爽爽| 制度丝袜99| 欧美在线视频99| 国产传媒1234区| 欧美日韩97在线| 美女诱惑一区| 综合在线导航一区| 男人的天堂2018东京热啪啪啪| 二对二中文字幕。| 蜜臀AV一区二区三区| 亚洲在线网站| 色五月首页| 四虎视频在线观看| 野狼福利社区| 91香蕉视频在线观看免费| 国产天天骚| 免费伦费视频在线观看| baiduhicn.com。| 国产伊人精品在线| 日韩操p| 日本网色| 亚热日本熟女| 男人的天堂网页| 爽 好舒服 无码刺激久久| 亚州成人A√| 大鸡巴久久| 午夜福利免费福利视频| 老师充足的奶水小说| 九九九九精品精| 中文字幕aⅴ在线视频| 久久亚洲不卡一区二区三区| 欧美翘臀视频网站一区二区三区| 亚洲最新a在线观看| 精品国产一区二区三区久久久蜜臀 | 天天干天天日天天射黄色片| 啊啊嗯嗯好爽| www.狠狠| 欧美丝袜91| 国产成人bd在线观看| 亚洲中文字幕日产无码久久| 中文字幕国产在线天堂| 天天干,夜夜爽| 天天爽天天| 青娱乐91| 国产一区二区免费福利片| 亚洲色色色| 91操熟女视频| 亚洲欧美国产其他二区| 亚洲国产青青| 国产理论视频在线播放| 日韩中文字幕2020| 国产又黄又粗的视频| 色av中文字幕| 日韩无码精品综合久久| 色第一页| 18啪啪手机免费性爱| 9超碰免费| 久久这里是精品| 欧美精品偷拍| 日韩欧美成人午夜福利| 欧美激情久久久久| www国产天美久久久| 亚洲色图第四色| 欧日a| 日夜尻逼网| 人人扣人人操| 一区二区高清视频| 国产夫妻一区二区| 日韩性爱1级片视频| 桃色人妻在线视频| 国产粉嫩出水在线播放| 亚洲欧洲日韩中文字幕一区| 视频二区美腿丝袜制服人妻欧美| 亚洲精品97| 欧洲乱码视频| 日韩成人精品视频自拍| 999热日韩精品| 欧美乱色| 亚洲日本激情| 97操B| 蜜臀aV午夜一区二区三区| 欧美国产伊人久久久久| 成人综合色网| 欧美伊人久久综合网| 少妇丝袜在线观看AV| 九九九精品成人免费视频小说| 丝袜综合| 密臀成人视频久久久| 超碰97亚洲| A V视频日本| 久久一二三四五六七八九区区区 | 蜜乳av一区二区| 天天做日日爱夜夜爽| a网站免费观看| 日本孕妇孕交| 最新av中文字幕高清| 91视频伊人| 可以在线观看的黄色网址| 国产浮力影院第1页| 色999;丁香五月| 91在线视频免费中出| 骚妻少妇精品性色无码四色A V| 99久久99九九99九九九| 五月天久久综合网| 男人天堂2019亚洲| 精品二区久久| 黑人白女精品一区| 精品国产污一区二区三区| 美性中文综合网| 综合亚州欧美| 在线国产探花| 色香91| 秋霞怕怕片| 1024人妻熟女一区二区三区| 五月丁香影院| 91狠狠综合久久| 激情小说成人日本无码一| 久热69九色熟妇97| 极品销魂美女一区二区| 玖玖婷婷五月天| 97操综合| 99热91| 日日妻色网| 天天色,天天干,天天干| 久久久久久久久久黄色网| 久一区久久蜜桃| 中文字幕 人妻不满 在线视频| 久九9精品| 亚洲精品视频在线播放| 少妇九九九九| 93人人操人人| 校园春色家庭伦理欧美激情| 国产精品免费视频不卡| 麻豆AV短剧| 密乳无码| 色大师网站www永久网站视频| 嫩草在线视频| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 亚洲国产福利视频| 91一区二区| 波多野42部激情无码喷潮| 少妇色综合| 国产激情av女片自拍| 青青久草| 天天摸夜夜摸| 婷婷视频网| 熟女这里只有精品6| 欧美少妇高潮| 国产青视频| 亚洲欧美精品一区天堂久久 | 亚洲情色 自拍| 中文字幕久久精视频久久大全| 入口操逼网站| 肏逼福利网站| 亚欧操逼片在线观看| 97人人夜| 国产精品国产拍高清AV| 国产精品一级特黄aaa大片在线观看| 1二区9| 色综合久| 久操在97| 中文字幕国产在线天堂| 麻豆天美在线喷水AV| 女人天堂AV五区在线| 无遮挡h肉动漫在线观看| 乱伦熟妇一区二区| 97久久超碰| 欧亚日韩一区在线| 免费AV中文网在线观看| 丰满人妻一区二区三区四区| 亚洲一区制服诱惑| 欧美一二级| 无码操逼天堂| 日韩人妻精品| 亚洲天堂久久| 欧美一区二区| 国产高清自拍视频| 操逼天美3区| 美女刺激久久国产欧美| 舔舔啊| 老熟妇一区二区三区啪啪| 夜夜操一区二区| 伊人久久蜜月| 精品人妻一区二区三区视频在线| 97久久久久| 性色aV一区二区三区噜噜| 69精品| 日韩精品色呦呦| 夜夜影视四色| 欧美日韩999| 久久久精品国产亚洲伊人| 四虎影视在线| 人妻黑丝袜电影| 九色 蝌蚪 熟女自 | 超碰91在线| 98色网| 日韩精品熟妇| 一二三四区电影| 青春草莓视频在线观看网址| 久久透逼视频| 中文字幕精品丝袜| 欧亚乱色熟女一区二区| 亚洲色色探花| 天天做日日爱夜夜爽| 蜜臀少妇一区二区| 有码免费观看| 欧美激情一| 日韩亚洲欧美中文字幕| 日本成人A片免费看| 9久久精品| 国产精品丝袜久久亚洲不卡| 日韩无码一级黄色av片| 色色色天美视频| 精产国品一区二三产品| 在线视频资源| 99精品欧美一区二区三区桃色| 九九av| 一区二区三区色综合| 手机在线观看不卡无码av| 久久精品国产72国产精品福利 | 婷婷国产精品九区| 日韩射精| 黄色二级片网站| 日欧操屄| 久久久精品一区二区| 日日操丁香五月天| 超碰一区二区| 大香蕉五月天婷婷| 欧美激情亚洲情色| 超碰99在线观看| 午夜超碰| 久久欧洲| 日韩无码专区| 91色图| 清清草影| 精彩视频日韩| 久久无码电影| 超碰九7| 免費人妻夜夜爽天天爽爽一区| 天天综合~91| 99青草| 91午夜无码| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 天天综合网1| 久久女人一区二区三区| 26uuu欧美日韩| 青娱乐啪啪视频| 欧美性,色九九| 亚洲欧美在线观看2021 | 97人妻碰碰中文无码久热丝袜| 欧美丰满熟妇XXXX性ppX人交| 国产情色在线| 九色 人妻 大香蕉| 亚洲另类小说卡通动漫| 男女香蕉一区二区| 中文字幕91综合| 免费啪啪啪网站18岁| 明星性猛交ⅹxxx乱大交| 伊人玖玖网| 中文字幕日韩国产传媒欧美精品| 1000部熟女视频在线观看| 免费成人在线熟妇网| 97天天搞在线| 久久综合九九| 亚洲欧美日韩精品久久久一区二区 | 青草成人免费视频一com| 久久久禁| 综合久欧洲| 色老汉玖玖爱| 成视频在线观看免费看| 性色av网站| 亚州精品人妻一二三区| 91欧美性| 91美女国产在线| 青青三级视频| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 无码高清操逼| 久久精品人人做人人看| 啪啪啪精品| 男人的天堂一区三区| 五月丁香综合| 丰满人妻一区二区三区在线| 国产嫩草精品A88AV在线| 使劲用力艹少妇视频一区二区| 久久久久一本一区二区青青蜜月| 蜜桃久久综合视频| 日韩美女高潮喷水视频| 国产小炒后入式| 99re只有精品| 人妻大香蕉| 97视频一区| 福利视频合集| 国产精品亚洲色婷婷久久久| 国语精品内射在线观看| 成人午夜视频免费播放| 综合激情五月天| 日han少妇无码| 久久高清无码夜夜操| 91精品人妻| 国产一区在线观看无码AV | 色婷婷婷五月天激情四射| 老鸭窝成人免费毛片视频| 93人人操人人| 熟女欧美日韩综合婷婷| 亚洲高清综合网| 日韩精品视频在线观看一卡二卡| 国产久久久9999| 蜜区区视频79| 久久一二区四| 欧洲自拍第一页| 久操网址| 亚洲人码13| 蜜臀操逼黄色视频操的好爽| 日韩激情视频| 精品无码秘 人妻一区二区 | 婷婷色一区| 校园春色五月天| 色嘟嘟人妻天堂网| 综合网 欧美| 男人的天堂啪啪啪啪啪蜜桃不卡| 综合大香蕉美。| 亚洲一卡2卡3卡4卡乱码网站 | 国产精品自在自拍视频| 1区2区3区中文字幕日韩| 五月天精品| 国产亲戚伦亲在线| 久久久999国产| 亚洲综合另类| 九九综合九九综合| oumeisetupian| 久久久免费的精品| 97久久久久久久久久| 国产CHASE男男GAYGA 毛多色婷婷| 久久久禁| 嫖老熟女A片一二三区| baiduhicn.com。| 亚洲啪啪视频一区二区| 亚洲 欧美 另类 日韩 人妻一区| 国产91福利小视频在线观看| 中文字幕av久久爽Av| 人人做,人人操,人人摸| 上床不卡网站| 人妻中文字幕日韩电影| 易易A毛视频| 欧美综合第一| 国产浮力影院第1页| 亚洲国产精品成人久久蜜臀| 四虎免费看黄| 狠狠干婷婷| 美女熟妇色| 欧美综合色图片| 啊啊啊啊啊啊啊国| 欧美日韩国产中文精品字幕自在自线 | 一二三四免费视频| 国产亚州高清国产拍精| 少妇高潮流水av免费| 97亚洲色图| 后入合集| 高颜值美女口爆高潮浪叫| 久久久天美| 男人天堂日日夜夜| 91爱综合| 激情五月综合网| 欧美一级A片在线看视频性色| 成人精品久久久午夜福利| 97超碰欧美| 97视频播放| 精品二区三四区五电影 | 欧美性色综合网| 婷婷久草一区二区三区| 神马久久久久久伦理片| 丁香五六月啪啪| 日本一区二区中文字幕久久| 91N综合网| 97资源站国产精品| 亚洲日韩资源| 天堂亚洲精品| 亚洲熟女综合一区二区| 天美传媒婬乱| 涩综合导航| av天堂精品久久| 尤物av网站免费在线播放| 精品日日人妻| 999久久久| 精品国产一区二区三区香蕉欧美| 久久五月天婷婷丁香中文字幕| 国产精品久久久无码AV网站| 日本国产成人亚洲精品无码| 久久久婷| 激情终合网| 伊人在线大香蕉视频久久| 青青草影视蜜久久| 91色宗合| 精品成人亚洲午夜电影| 国产aⅴ无码片毛片一级网站| 高清成年美女黄网站免费大全 | 五月大香蕉| 久久久9品一区二区三区| 97天天操天天干| 婷婷激情丁香| 综合五月婷婷亚洲一区| 99热精品在线播放| 91黑丝美女| 97超碰香蕉| 美女操逼福利视频| 欧美亚男人的天堂| 国产又黄又粗又猛大片| a片偷拍视频| 天天做天天爱| 97超碰中文| 亚洲婷婷综合网| 色综合99| 97国产|免费| 一级久久性爱视频| 啊啊啊啊啊啊啊网址在线观看| 丰满人妻一区二区三区四区| 色大香蕉97N| 又粗又长又爽在线观看| 久久手机好看网站| 成人怡红院| 9999久久久久| 日日夜夜骑| 欧美极度丰满熟妇hd| 亚州综合AⅤ| 这里只有精品视频在线观看麻豆| 男人干美女| 一级日本牲交大片好爽在线看| AV高清一区| 国产欧美精选自拍一区| 婷婷久草| 99精品无码| 成人精品在线免费视频| 亚洲Av噜噜一区二区三区妖精| 亚洲97久久精品亚洲| 久射吧| 久久婷婷国产一区二区色| 熟女探花啪啪| 精品中文日韩字幕视频| 免费久久精品麻豆一区二区av| 久久婷婷五月| 夜夜欢天天干| 久久精品老司| 99性爱视频| 成人a大片在线观看| 96久久久久久久| 国产成人主播| 成人午夜视频免费播放| 一区二区三| 日日噜噜夜夜久久亚洲一区二区 | 校园春色 男人天堂 | 国内一级精品| 久久99深爱久久99精品| 麻豆影音天美视频| 婷婷五月天成人| 欧美熟女操屄| 偷拍视频青青草在线视频| 97色色国产视频| 校园春色制服丝袜中文字亚洲| 永久免费发布性爱网| 欧美激情久操网| 91九色丨风韵犹存| 校园春色家庭伦理欧美激情| 无码视频一区二区| 超碰日本97美女人妻人人玩人人爱| 思思热免费在线视频| ..日韩av毛片精品久久久| 91成人久久| 区二区亚洲婷| 国产AB视频| 4虎在线视频| 青青久操| 美国久久一二三四| 丝袜喷水在线| 玖玖爱综合| 亚洲欧美天堂在线| 色盈盈影院| 91影视亚洲| 成人一级二级| 抽插亚洲无码| 99热伊人| 精品九九九九| 国产精品一区二区久久精品| 秋霞操逼片| 欧美成人AⅤ大片在线观看| 99热成人| 日本男人插女人的逼黄色| 九九九九九九免费视频| 欧美激情在线观看视频| 黄骗免费网站| 亚洲啪AⅤ永久无码| 亚洲aV无码成人在线观看| 国产原创精品| 在线情色电影 91大 | 熟女高潮合集-永久久久-成人AV| 国产蜜臀在线| 亚洲97网站| 97久久国产| 久久久久人妻二区精品叶可怜| 91色婷婷综合久久中文字幕二区| 91大胆欧美| 亚洲黄色电影| 100啪啪视频大全| 国产这里只有精品| 超碰97最新人妻| 男人的天堂99| 国产专区第一页| 伊色综合天堂色97| 96国产精品| 18禁超污无遮挡无码免费网| 蜜桃臀 后入 一区 二区 三区 在线| 日韩中文9| 人人潮人人摸| 九九九久千久久激情蜜桃在线看 | 中文字幕人妻色偷偷久久皮| 91制服丝袜| 国产亚洲综合欧美一区| 狠狠干2020| 午夜一级免费毛片| 亚洲最大黄网| 色五月av| 婷婷成人五月天| 天天欧美97| 99精品免费| 亚洲自拍天堂| 9丨久久九九九| 欧美亚洲美少妇一区二区| 久久久久国产一区二| 色吧 综合| 人妻色情天天操| 日本日日色视频| 五月开心网| jizzjizz欧美| 四虎影视永久在线免费| 婷婷九月国产| 老熟女91av| 熟女中出视频| 操逼操2| 久久亚洲不卡| 国产精品人妻无码久久久互動交流 | 青青草中日韩在线| 久久久久国产精品喷潮免费观看臀 | 亚洲精品天天影视综合网 | 色综合加勒比| 久久久久久久久久黄色网| 一,爱啪啪,在线免费视频| 日韩一级二级三级| 亚洲情色在线| 熟女突然公开看18禁影片 | 久久久久久十| 骚货人妻偷情自拍在线视频| 97超碰人人操人人操| 日本熟妇色熟妇在线视频播放| 欧亚乱色熟女一区二区| 丰满人妻区一区二区三| 性性久久| 天天享受天天看| 一区二区偷拍拍视频| 日本一级婬片试看三分钟| 美女黄色91| 噜噜噜亚洲精品| wwe 天天干.com| 大香蕉伊人一区在线观看| 天天操天天舔| 亚欧成人中文字幕一区| 6080YYY午夜理论片在线观看| 美女啊啊啊啊啊|