国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

為什么說容器是單進程模型

云計算 前端
Go 語言現(xiàn)在的一個主要應用領域就是云原生技術,包括容器(以 Docker 為代表)、Kubernetes、Prometheus 等。后面將寫一系列文章來介紹一下云原生技術棧中的關鍵技術。

Go 語言現(xiàn)在的一個主要應用領域就是云原生技術,包括容器(以 Docker 為代表)、Kubernetes、Prometheus 等。后面將寫一系列文章來介紹一下云原生技術棧中的關鍵技術。

過去兩年很多大公司的一個主要技術方向就是將應用上云,在這個過程中的一個典型錯誤用法就是將容器當成虛擬機來使用,將一堆進程啟動在一個容器內(nèi)。但是容器和虛擬機對進程的管理能力是有著巨大差異的。不管在容器中還是虛擬機中都有一個一號進程,虛擬機中是 systemd 進程,容器中是 entrypoint 啟動進程,然后所有的其他線程都是一號進程的子進程,或者子進程的子進程,遞歸下去。這里的主要差異就體現(xiàn)在 systemd 進程對僵尸進程回收的能力。如果你想和更多容器技術專家交流,可以加我微信liyingjiese,備注『加群』。群里每周都有全球各大公司的最佳實踐以及行業(yè)最新動態(tài)。

[[277611]]

僵尸進程

說到僵尸進程,這里簡單介紹一下 Linux 系統(tǒng)中的進程狀態(tài),我們可以通過 ps 或者 top 等命令查看系統(tǒng)中的進程,比如通過 ps aux 在我的 ecs 虛擬機上面得到如下的輸出。 

  1. [root@emr-header-1 ~]# ps aux 
  2. USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND 
  3. root         1  0.1  0.0 190992  3568 ?        Ss   Mar16 289:04 /usr/lib/systemd/systemd --switched-root --system --de 
  4. root         2  0.0  0.0      0     0 ?        S    Mar16   0:05 [kthreadd] 
  5. root         3  0.0  0.0      0     0 ?        S    Mar16  13:01 [ksoftirqd/0] 
  6. root         5  0.0  0.0      0     0 ?        S<   Mar16   0:00 [kworker/0:0H] 
  7. root         7  0.0  0.0      0     0 ?        S    Mar16  14:41 [migration/0] 
  8. root         8  0.0  0.0      0     0 ?        S    Mar16   0:00 [rcu_bh] 
  9. root         9  0.0  0.0      0     0 ?        S    Mar16 243:19 [rcu_sched] 
  10. root        10  0.0  0.0      0     0 ?        S    Mar16   0:50 [watchdog/0] 
  11. root        11  0.0  0.0      0     0 ?        S    Mar16   0:39 [watchdog/1] 
  12. root        12  0.0  0.0      0     0 ?        S    Mar16  23:51 [migration/1] 
  13. root        13  0.0  0.0      0     0 ?        S    Mar16  15:44 [ksoftirqd/1] 
  14. root        15  0.0  0.0      0     0 ?        S<   Mar16   0:00 [kworker/1:0H] 

我們可以看到排在第一位的就是前面說到的 1 號進程 systemd。其中的 STAT 那一列就是進程狀態(tài),這里的狀態(tài)都是和 S 有關的,但是正常還有 R、D、Z 等狀態(tài)。各個狀態(tài)的含義簡單描述如下:

  • S:Interruptible Sleep,中文可以叫做可中斷的睡眠狀態(tài),表示進程因為等待某個資源或者事件就緒而被系統(tǒng)暫時掛起。當資源或者事件 Ready 的時候,進程輪轉(zhuǎn)到 R 狀態(tài)。
  • R:也就是 Running,有時候也可以指代 Runnable,表示進程正在運行或者等待運行。
  • Z:Zombie,也就是僵尸進程。我們知道每個進程都是會占用一定的資源的,比如 pid 等,如果進程結(jié)束,資源沒有被回收就會變成僵尸進程。
  • D:Disk Sleep,也就是 Uninterruptible Sleep,不可中斷的睡眠狀態(tài),一般是進程在等待 IO 等資源,并且不可中斷。D 狀態(tài)相信很多人在實踐中第一次接觸就是 ps 卡住。D 狀態(tài)一般在 IO 等資源就緒之后就會輪轉(zhuǎn)到 R 狀態(tài),如果進程處于 D 狀態(tài)比較久,這個時候往往是 IO 出現(xiàn)問題,解決辦法大部分情況是重啟機器。
  • I:Idle,也就是空閑狀態(tài),不可中斷的睡眠的內(nèi)核線程。和 D 狀態(tài)進程的主要區(qū)別是可能實際上不會造成負載升高。

關于僵尸進程,這里繼續(xù)討論一下。對于正常的使用情況,子進程的創(chuàng)建一般需要父進程通過系統(tǒng)調(diào)用 wait() 或者 waitpid() 來等待子進程結(jié)束,從而回收子進程的資源。除了這種方式外,還可以通過異步的方式來進行回收,這種方式的基礎是子進程結(jié)束之后會向父進程發(fā)送 SIGCHLD 信號,基于此父進程注冊一個 SIGCHLD 信號的處理函數(shù)來進行子進程的資源回收就可以了。記住這兩種方式,后面還會涉及到。

僵尸進程的最大危害是對資源的一種永久性占用,比如進程號,系統(tǒng)會有一個最大的進程數(shù) n 的限制,也就意味一旦 1 到 n 進程號都被占用,系統(tǒng)將不能創(chuàng)建任何進程和線程(進程和線程對于 OS 而言,使用同一種數(shù)據(jù)結(jié)構來表示,task_struct)。這個時候?qū)τ谟脩舻囊粋€直觀感受就是 shell 無法執(zhí)行任何命令,這個原因是 shell 執(zhí)行命令的本質(zhì)是 fork。 

  1. [root@emr-header-1 ~]# ulimit -a 
  2. core file size          (blocks, -c) 0 
  3. data seg size           (kbytes, -d) unlimited 
  4. scheduling priority             (-e) 0 
  5. file size               (blocks, -f) unlimited 
  6. pending signals                 (-i) 63471 
  7. max locked memory       (kbytes, -l) 64 
  8. max memory size         (kbytes, -m) unlimited 
  9. open files                      (-n) 131070 
  10. pipe size            (512 bytes, -p) 8 
  11. POSIX message queues     (bytes, -q) 819200 
  12. real-time priority              (-r) 0 
  13. stack size              (kbytes, -s) 8192 
  14. cpu time               (seconds, -t) unlimited 
  15. max user processes              (-u) 63471 
  16. virtual memory          (kbytes, -v) unlimited 
  17. file locks                      (-x) unlimited 

孤兒進程

前面說到如果子進程先于父進程退出,并且父進程沒有對子進程殘留的資源進行回收的話將會產(chǎn)生僵尸進程。這里引申另外一種情況,父進程先于子進程退出的話,那么子進程的資源誰來回收呢?

父進程先于子進程退出,這個時候我們一般將還在運行的子進程稱為孤兒進程,但是實際上孤兒進程并沒有一個明確的定義,他的狀態(tài)還是處于上面討論的幾種進程狀態(tài)中。那么孤兒進程的資源誰來回收呢?類 Unix 系統(tǒng)針對這種情況會將這些孤兒進程的父進程置為 1 號進程也就是 systemd 進程,然后由 systemd 來對孤兒進程的資源進行回收。

單進程模型的本質(zhì)

看完上面兩節(jié)大家應該知道了虛擬機或者一個完整的 OS 是如何避免僵尸進程的。但是,在容器中,1 號進程一般是 entry point 進程,針對上面這種 將孤兒進程的父進程置為 1 號進程進而避免僵尸進程 處理方式,容器是處理不了的。進而就會導致容器中在孤兒進程這種異常場景下僵尸進程無法徹底處理的窘境。

所以說,容器的單進程模型的本質(zhì)其實是容器中的 1 號進程并不具有管理多進程、多線程等復雜場景下的能力。如果一定在容器中處理這些復雜情況的,那么需要開發(fā)者對 entry point 進程賦予這種能力。這無疑是加重了開發(fā)者的心智負擔,這是任何一項大眾技術或者平臺框架都不愿看到的尷尬之地。

如何避免

除了第二節(jié)討論的開發(fā)者自己賦予 entrypoint 進程管理多進程的能力,這里我更推薦借助 Kubernetes 來做這件事情。我想現(xiàn)在應該也沒有人對容器進行人工管理了,大部分人應該都轉(zhuǎn)向了容器編排和調(diào)度工具 Kubernetes 陣營了(對于那些還在使用 Swarm 的一小波人,我勸你們早日棄暗投明 :))。

Kubernetes 中可以將多個容器編排到一個 Pod 里面,共享同一個 Linux NameSpace。這項技術的本質(zhì)是使用 Kubernetes 提供一個 pause 鏡像,展開來說就是先用 pause 鏡像實例化出 NameSpace,然后其他容器加入這個 NameSpace 從而實現(xiàn) NameSpace 共享。突然意識到這塊需要有容器和 NameSpace 的技術背景,限于篇幅,希望你可以自行搜索這種技術背景。或者我下一篇文章討論一下容器技術的本質(zhì)。

言歸正傳,我們來介紹一下 pause。pause 是 Kubernetes 在 1.16 版本引入的技術,要使用 pause,我們只需要在 Pod 創(chuàng)建的 yaml 中指定 shareProcessNamespace 參數(shù)為 true,如下: 

  1. apiVersion: v1 
  2. kind: Pod 
  3. metadata: 
  4. name: nginx 
  5. spec: 
  6. shareProcessNamespace: true 
  7. containers: 
  8. name: nginx 
  9. image: nginx 
  10. name: shell 
  11. image: busybox 
  12. securityContext: 
  13.   capabilities: 
  14.     add
  15.     - SYS_PTRACE 
  16. stdin: true 
  17. tty: true 

創(chuàng)建 Pod:

  1. kubectl apply -fshare-process-namespace.yaml 

attach 到 Pod 中,ps 查看進程列表: 

  1. / # ps ax 
  2. PID   USER     TIME  COMMAND 
  3. 1 root      0:00 /pause 
  4. 8 root      0:00 nginx: master process nginx -g daemon off
  5. 14 101       0:00 nginx: worker process 
  6. 15 root      0:00 sh 
  7. 21 root      0:00 ps ax 

我們可以看到 Pod 中的 1 號進程變成了 /pause,其他容器的 entrypoint 進程都變成了 1 號進程的子進程。這個時候開始逐漸逼近事情的本質(zhì)了:/pause 進程是如何處理將孤兒進程的父進程置為 1 號進程進而避免僵尸進程的呢?我們看一下源碼,git repo: pause.c: 

  1. #define STRINGIFY(x) #x 
  2. #define VERSION_STRING(x) STRINGIFY(x) 
  3.  
  4. #ifndef VERSION 
  5. #define VERSION HEAD 
  6. #endif 
  7.  
  8. static void sigdown(int signo) { 
  9. psignal(signo, "Shutting down, got signal"); 
  10. exit(0); 
  11.  
  12. static void sigreap(int signo) { 
  13. while (waitpid(-1, NULL, WNOHANG) > 0) 
  14.  
  15. int main(int argc, char **argv) { 
  16. int i; 
  17. for (i = 1; i < argc; ++i) { 
  18. if (!strcasecmp(argv[i], "-v")) { 
  19.   printf("pause.c %s\n", VERSION_STRING(VERSION)); 
  20.   return 0; 
  21.  
  22. if (getpid() != 1) 
  23. /* Not an error because pause sees use outside of infra containers. */ 
  24. fprintf(stderr, "Warning: pause should be the first process\n"); 
  25.  
  26. if (sigaction(SIGINT, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0) 
  27. return 1; 
  28. if (sigaction(SIGTERM, &(struct sigaction){.sa_handler = sigdown}, NULL) < 0) 
  29. return 2; 
  30. if (sigaction(SIGCHLD, &(struct sigaction){.sa_handler = sigreap, 
  31.                                          .sa_flags = SA_NOCLDSTOP}, 
  32.             NULL) < 0) 
  33. return 3; 
  34.  
  35. for (;;) 
  36. pause(); 
  37. fprintf(stderr, "Error: infinite loop terminated\n"); 
  38. return 42; 
  39. }  

重點關注一下 35 行和 13 行,這個不就是我們上面說的。

  • 除了這種方式外,還可以通過異步的方式來進行回收,這種方式的基礎是子進程結(jié)束之后會向父進程發(fā)送 SIGCHLD 信號,基于此父進程注冊一個 SIGCHLD 信號的處理函數(shù)來進行子進程的資源回收就可以了。

SIGCHLD 信號的處理函數(shù)核心就是這一行 while (waitpid(-1, NULL, WNOHANG) > 0) ,其中 WNOHANG 參數(shù)是為了讓父進程直接返回不阻塞。

總結(jié)

容器化改造的路非常漫長,對于很多業(yè)務同學在改造的過程中由于一些思維的慣性就想把容器當成一個虛擬機來使用,這個可能會導致非常多的問題。或許我們可以探究一些容器的設計模式,以便進行更好的實踐。

 

責任編輯:未麗燕 來源: Dockone.in
相關推薦

2025-09-30 09:10:16

2015-12-04 10:04:21

Linux容器虛擬化

2022-03-14 08:33:09

TypeScriptJavaScript前端

2020-07-03 14:05:26

Serverless云服務商

2021-11-29 18:27:12

Web Wasmjs

2018-03-22 14:47:13

容器開發(fā)人員筆記本

2025-05-27 10:10:00

Java緩存開發(fā)

2019-09-23 13:37:09

Anthos谷歌Kubernetes

2012-02-08 10:02:53

Web

2011-09-20 15:51:42

NoSQL

2011-05-05 08:51:18

PHP

2025-04-07 08:30:00

緩存Java開發(fā)

2023-05-05 16:26:33

2011-10-27 13:37:51

網(wǎng)頁設計

2019-08-06 10:05:03

Linux操作系統(tǒng)C語言

2022-10-31 08:29:37

MySQL單表參數(shù)

2023-05-04 07:44:13

編程界小語言Java

2019-01-18 15:01:17

云計算運維管理

2018-03-07 15:50:10

物聯(lián)網(wǎng)語言信息技術

2023-03-21 10:16:36

點贊
收藏

51CTO技術棧公眾號

中文字幕一区二区三区四区五区六区 | 2019最新中文字幕| a在线免费观看| 一区在线播放视频| 日韩网站在线免费观看| 国产一区啦啦啦在线观看| 欧美福利精品| 国产精品久久久久久模特| 亚洲一区二区三区在线免费观看| 伊人春色精品| 欧美在线影院在线视频| 岛国精品一区| 色呦呦一区二区三区| 久久另类ts人妖一区二区| 久久天堂av| 国产精一品亚洲二区在线视频| 中文字幕日韩综合av| 香蕉521av成人网| 国产精品15p| 欧美日韩中文精品| 日韩亚洲在线视频| 中文字幕av亚洲精品一部二部| 国产91色在线免费| 教室别恋欧美无删减版| 国产精品久久久久久久app| 成人婷婷网色偷偷亚洲男人的天堂| 欧美亚洲另类在线| 日韩一区电影| 丁香五月网久久综合| 激情婷婷久久| 天堂社区 天堂综合网 天堂资源最新版| 日韩激情视频网站| 亚洲乱码一区二区三区| 国产在线播精品第三| 男人天堂手机在线视频| 99re在线精品| 成人黄色免费电影| 亚洲444eee在线观看| 成人jjav| 亚洲精品www久久久| av成人在线网站| 欧美在线不卡区| 五月天久久久| 色99中文字幕| 91影院在线免费观看| 黄色一级影院| 欧美日精品一区视频| 久久99亚洲网美利坚合众国| 日韩中文视频免费在线观看| 窝窝社区一区二区| 久久久久久国产精品mv| av一区二区三区黑人| 男人本色网站| 日韩一二在线观看| 精品午夜av| 亚洲综合中文字幕在线观看| 日本午夜精品视频在线观看| 美女av免费在线观看| 黑人精品xxx一区| 欧美日韩在线观看首页| 麻豆精品国产传媒mv男同| 五月天亚洲综合| 国产欧美精品一区| 欧洲一级在线观看| 精品一区二区亚洲| 亚洲精品国产动漫| 日韩av一区二区三区美女毛片| 91一区二区三区在线观看| 亚洲色图图片网| 亚洲精品综合久久中文字幕| 国产精品美女久久久久久不卡| 久久久久久高清| 久久精品在线观看| 日本激情在线观看| 麻豆国产精品va在线观看不卡| 午夜欧美精品| 国产男女在线观看| 欧美色区777第一页| 欧美日韩中出| 欧美一区激情视频在线观看| 中文字幕精品一区二区三区精品| 麻豆av在线导航| 亚州国产精品久久久| 蜜臀av性久久久久蜜臀aⅴ | 日韩av有码在线| 国产一区网站| 国产欧美久久久久| 欧美性受xxxx| 日韩高清电影免费| 国产精品三级一区二区| 日本黄色一区二区| 国产精品一区二区三区美女| 中国人体摄影一区二区三区| 欧美日韩中文字幕日韩欧美| 日本一区二区三区电影免费观看 | 亚洲高清网站| 电影天堂最新网址| 中文字幕不卡在线视频极品| 亚洲国产mv| 自拍偷拍电影| 免费av一区二区| 美女网站一区二区| av基地在线| 成人在线视频网站| 亚洲人成精品久久久久| 亚洲精品乱码日韩| 男女激烈动态图| 欧美一区二区福利在线| 婷婷色综合网| 熟女人妇 成熟妇女系列视频| 亚洲欧美在线网| 欧美专区第一页| 亚洲免费av网址| 成人日韩av| 日本在线播放一区| 欧美中文字幕一区| 日产精品一区二区| 国产成人综合美国十次| 肉色丝袜一区二区| 丝袜美女写真福利视频| 欧美高清自拍一区| 久久久久久久性| 日本精品视频| 能在线观看的av网站| 波霸ol色综合久久| av在线不卡免费看| 欧美91在线|欧美| 日本www在线视频| 日韩小视频在线| 91在线视频播放地址| 亚洲男人在线| 91看片就是不一样| 欧美国产日本高清在线| 久久久激情视频| 神马久久av| 国内精品卡一卡二卡三新区| 国产欧美一区二区三区在线看| 香蕉成人伊视频在线观看| 香蕉av一区二区| www.亚洲.com| 日韩av一区二区三区在线| 99精品黄色片免费大全| 免费看av不卡| 轻点好疼好大好爽视频| 一区二区三欧美| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲精品一二三| 日韩午夜电影网| 日本在线视频1区| 国产精品初高中精品久久| 欧美三级中文字幕在线观看| 亚洲一区网站| 涩涩涩视频在线观看| 日韩 欧美 视频| 久久男人资源视频| 玉米视频成人免费看| 中文精品久久| 国精产品一区一区三区mba下载| 一级黄色片播放| 欧美裸体男粗大视频在线观看| 一区二区三区在线视频播放| 亚洲高清电影| 黑人巨大精品| 四虎影视av| 久久波多野结衣| 中文字幕在线观看日韩| 亚洲丝袜美腿综合| 亚洲在线观看| 欧美大片91| 日韩国产福利| av动漫在线免费观看| 97久久久久久| 欧美日韩成人综合在线一区二区| 国产毛片一区二区| 自拍偷拍欧美一区| 羞羞的视频在线看| 亚洲一区在线不卡| 狠狠色综合一区二区| 色婷婷综合久久久久| 婷婷中文字幕一区三区| 韩国女主播成人在线观看| 香蕉久久夜色精品国产使用方法| 欧美日韩在线资源| 久久综合久久色| 国产一区二区不卡视频在线观看 | 国产美女扒开尿口久久久| 日韩一区二区免费视频| 久久久99精品免费观看| 欧美一区影院| 日韩一区二区三区在线免费观看| 日本免费一二区| 中文视频一区视频二区视频三区| 国语对白做受69| 精品久久久久久久久久久久久久久 | 日韩精品丝袜美腿| 青草在线视频在线观看| 激情小说激情视频| 亚洲人久久久| 国产精品视频播放| 色婷婷成人综合|