精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

刨根問底兒,看我如何處理 Too Many Open Files 錯誤!

開發 項目管理
如果你的項目中支持高并發,或者是測試過比較多的并發連接。那么相信你一定遇到過“Too many open files”這個錯誤。

[[381472]]

 本文轉載自微信公眾號「開發內功修煉」,作者張彥飛allen 。轉載本文請聯系開發內功修煉公眾號。   

如果你的項目中支持高并發,或者是測試過比較多的并發連接。那么相信你一定遇到過“Too many open files”這個錯誤。

這個錯誤的出現其實是正常的,因為每打開一個文件(包括socket),都需要消耗一定的內存資源。為了避免個別進程不受控制地打開了過多的文件而讓整個服務器崩潰,Linux 對打開的文件描述符數量有限制。

但是解決這個錯誤“奇葩”的地方在于,竟然需要修改三個參數:fs.nr_open、nofile(其實 nofile 還分 soft 和 hard) 和 fs.file-max。這幾個參數里有的是進程級的、有的是系統級的、有的是用戶進程級的,說一遍都覺得好亂。而且另外這幾個參數還有依賴關系,著實比較復雜。

不知道你,反正飛哥我是根本記不住哪個是哪個。每次遇到這種問題,還是都得再繼續 Google 一遍。但由于復雜性,所以其實網上的很多帖子里也都并沒有真正搞清楚。如果照搜索出來的文章改,稍有不慎就會踩雷,把機器搞出問題。

我在測試最大TCP連接數的時候就踩過兩次坑。

第一次是當時開了二十個子進程,每個子進程開啟了五萬個并發連接興高采烈準備測試百萬并發。結果倒霉催地忘了改 file-max 了。實驗剛開始沒多大一會兒就開始報錯“Too many open files”。但問題是這個時候更悲催的是發現所有的命令包括 ps、kill也同時無法使用了。因為它們也都需要打開文件才能工作。后來沒辦法,重啟系統解決的。

另外一次是重啟機器完了之后發現無法 ssh 登錄了。后來找運維工程部的同學報障以后才算是修復。最終發現是因為 hard nofile 比 fs.nr_open 高了,直接導致無法登陸。(其實我把 fs.nr_open 加大過,但是用的是 echo 命令 修改的。系統一重啟,還原了)。

一、找到源代碼

對于這三個家伙,我真的是無法言語更多了。所以我下定了決心,一定要把它們徹底搞清楚。怎么搞?那沒有比把它的源碼扒出來能看的更準確了。我們就拿創建 socket 來舉例,首先找到 socket 系統調用的入口

  1. //file: net/socket.c 
  2. SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) 
  3.  retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK)); 
  4.  if (retval < 0) 
  5.   goto out_release; 

我們看到 socket 調用 sock_map_fd 來創建相關內核對象。接著我們再進入 sock_map_fd 瞧瞧。

  1. //file: net/socket.c 
  2. static int sock_map_fd(struct socket *sock, int flags) 
  3.  struct file *newfile; 
  4.  
  5.  //在這里會判斷打開文件數是否超過 soft nofile 和 fs.nr_open 
  6.  //獲取 fd 句柄號 
  7.  int fd = get_unused_fd_flags(flags);   
  8.  if (unlikely(fd < 0)) 
  9.   return fd; 
  10.  
  11.  //在這里會判斷打開文件數是否超過 fs.file-max 
  12.  //創建 sock_alloc_file對象 
  13.  newfile = sock_alloc_file(sock, flags, NULL);  
  14.  if (likely(!IS_ERR(newfile))) { 
  15.   fd_install(fd, newfile); 
  16.   return fd; 
  17.  } 
  18.  
  19.  put_unused_fd(fd); 
  20.  return PTR_ERR(newfile); 

為什么創建一個socket又要申請 fd,又要申請 sock_alloc_file 呢?我們看一個進程打開文件時的內核數據結構圖就明白了

結合上圖,就能輕松理解這兩個函數的作用

  • get_unused_fd_flags:申請 fd,這只是一個在找一個可用的數組下標而已
  • sock_alloc_file:申請真正的 file 內核對象

二、找到進程級限制 nofile 和 fs.nr_open

接下來,我們再回到最大文件數量的判斷上。這里我直接把結論拋出來。get_unused_fd_flags 中判斷了 nofile、和 fs.nr_open。如果超過了這兩個參數,就會報錯。請看!

  1. //file: fs/file.c 
  2. int get_unused_fd_flags(unsigned flags) 
  3.  // RLIMIT_NOFILE 是 limits.conf 中配置的 nofile 
  4.  return __alloc_fd( 
  5.   current->files,  
  6.   0,  
  7.   rlimit(RLIMIT_NOFILE),  
  8.   flags 
  9.  ); 

在get_unused_fd_flags 中,調用了 rlimit(RLIMIT_NOFILE)。這個是讀取的 limits.conf 中配置的 soft nofile,代碼如下:

  1. //file: include/linux/sched.h 
  2. static inline unsigned long task_rlimit(const struct task_struct *tsk, 
  3.   unsigned int limit) 
  4.  return ACCESS_ONCE(tsk->signal->rlim[limit].rlim_cur); 

通過當前進程描述訪問到 rlim[RLIMIT_NOFILE],這個對象的 rlim_cur 是 soft nofile(rlim_max 對應 hard nofile )。

緊接著讓我們進入 __alloc_fd() 中來

  1. //file: include/uapi/asm-generic/errno-base.h 
  2. #define EMFILE  24 /* Too many open files */ 
  3.  
  4. int __alloc_fd(struct files_struct *files, 
  5.         unsigned start, unsigned end, unsigned flags) 
  6.  ... 
  7.  error = -EMFILE; 
  8.  
  9.  //看要分配的文件號是否超過 end(limits.conf 中的 nofile) 
  10.  if (fd >= end
  11.   goto out
  12.  
  13.  error = expand_files(files, fd); 
  14.  if (error < 0) 
  15.   goto out
  16.  ... 

在__alloc_fd() 中會判斷要分配的句柄號是不是超過了 limits.conf 中 nofile 的限制。fd 是當前進程相關的,是一個從 0 開始的整數。如果超限,就報錯 EMFILE (Too many open files)。

這里注意個小細節,那就是進程里的 fd 是一個從 0 開始的整數。只要確保分配出去的 fd 編號不超過 limits.conf 中 nofile,就能保證該進程打開的文件總數不會超過這個數。

接著我們看到調用又會進入 expand_files:

  1. static int expand_files(struct files_struct *files, int nr) 
  2.  //2. 判斷打開文件數是否超過 fs.nr_open 
  3.  if (nr >= sysctl_nr_open)    
  4.   return -EMFILE; 

在 expand_files 我們看到,又到 nr (就是 fd 編號) 和 fs.nr_open 相比較了。超過這個限制,返回錯誤 EMFILE (Too many open files)。

由上可見,無論是和 fs.nr_open,還是和 soft nofile 比較,都用的是當前進程的文件描述符序號在比較的,所以這兩個參數都是進程級別的。

有意思的是和這兩個參數的比較幾乎是前后腳進行的,所以它兩的作用也基本一樣。Linux之所以分兩個參數來控制,那是因為 fs.nr_open 是系統全局的,而 nofile 則可以分用戶來分別控制。

所以,現在我們可以得出第一個結論。

結論1:soft nofile 和 fs.nr_open的作用一樣,它兩都是限制的單個進程的最大文件數量。區別是 soft nofile 可以按用戶來配置,而 fs.nr_open 所有用戶只能配一個。

三、找到系統級限制 fs.nr_open

我們在回過頭來看 sock_map_fd 中調用的另外一個函數 sock_alloc_file,在這個函數里我們發現它會和 fs.file-max 這個系統參數來比較。用啥比的呢?

  1. //file: fs/file_table.c 
  2. struct file *sock_alloc_file(struct socket *sock, int flags, const char *dname) 
  3.  file = alloc_file(&path, FMODE_READ | FMODE_WRITE, 
  4.    &socket_file_ops); 
  5.  
  6. struct file *alloc_file(struct path *path, fmode_t mode, 
  7.   const struct file_operations *fop) 
  8.  file = get_empty_filp(); 
  9.  ... 
  10.  
  11. struct file *get_empty_filp(void) 
  12.  //files_stat.max_files就是 fs.file-max參數 
  13.  if (get_nr_files() >= files_stat.max_files  
  14.   && !capable(CAP_SYS_ADMIN) //注意這里root賬號并不受限制 
  15.   ) { 
  16.  } 

可見是用 get_nr_files() 來和 fs.file-max來比較的。根據該函數的注釋我們能看到它是當前系統打開的文件描述符總量。如下:

  1. /* 
  2.  * Return the total number of open files in the system 
  3.  */ 
  4. static long get_nr_files(void) 
  5.  ... 

另外注意下 !capable(CAP_SYS_ADMIN) 這行。看完這句,我才恍然大悟,原來 file-max 這個參數只限制非 root 用戶。開篇中我提到的文件打開過多時無法使用 ps,kill 等命令,是因為我用的非 root 賬號操作的。哎,下次再遇到這種文件直接用 root 去 kill 就行了。之前竟然丟臉地采用了重啟機器大法。。

所以現在我們可以得出另一個結論了。

結論2:fs.file-max: 整個系統上可打開的最大文件數,但不限制 root 用戶

總結一下

我們總結一下,其實在 Linux 上能打開多少個文件,限制有兩種:

  • 第一種,進程級別的,限制的是單個進程上可打開的文件數。具體參數是 soft nofile 和 fs.nr_open。它們兩個的區別是 soft nofile 可以不同用戶配置不同的值。而 fs.nr_open 在一臺 Linux 上只能配一次。
  • 第二種,系統級別的,整個系統上可打開的最大文件數,具體參數是fs.file-max。但是這個參數不限制 root 用戶。

另外這幾個參數之間還有耦合關系,因此還要注意以下三點:

  • 1、如果你想加大 soft nofile, 那么 hard nofile 也需要一起調整。因為如果 hard nofile 設置的低, 你的 soft nofile 設置的再高都沒用,實際生效的值會按二者里最低的來。
  • 2、如果你加大了 hard nofile,那么 fs.nr_open 也都需要跟著一起調整。如果不小心把 hard nofile 設置的比 fs.nr_open 大了,后果比較嚴重。會導致該用戶無法登陸。如果設置的是 * 的話,那么所有的用戶都無法登陸。
  • 3、還要注意如果你加大了 fs.nr_open,但是用的是 echo "xx" > ../fs/nr_open 的方式,剛改完你可能覺得沒問題。只要機器一重啟你的 fs.nr_open 設置就會失效,還是會無法登陸。

假如你想讓你的進程可以打開 100 萬個文件描述符,我覺得比較穩妥點的修改方法是干脆都直接用 conf 文件的方式來改。這樣比較統一,也比較安全。

  1. # vi /etc/sysctl.conf 
  2. fs.nr_open=1100000  //要比 hard nofile 大一點 
  3. fs.file-max=1100000 //多留點buffer 
  4. # sysctl -p 
  5. # vi /etc/security/limits.conf 
  6. *  soft  nofile  1000000 
  7. *  hard  nofile  1000000 

通過這種方式修改,你就可以繞過飛哥踩過的坑了。

 

責任編輯:武曉燕 來源: 開發內功修煉
相關推薦

2019-07-04 10:49:13

HTTPWebSocket協議

2015-07-02 15:04:53

CSS好奇心+

2017-01-09 16:35:25

socket函數fd備用

2022-04-20 11:41:45

Kafka數據解決方案

2013-10-10 15:41:38

綠色數據中心數據中心

2012-09-07 09:23:01

Win 8操作系統

2010-03-22 16:51:31

無線網絡穩定性

2023-04-26 00:06:22

服務器死循環報錯

2023-02-07 08:36:32

2020-11-13 07:14:55

Kafka消息中間件

2024-07-07 21:39:34

2019-08-09 11:25:01

Java虛擬機Java程序員

2019-06-18 15:20:01

MySQL連接錯誤數據庫

2024-09-04 16:00:24

PostgreSQL數據庫

2022-12-06 09:10:56

KVC原理數據篩選

2011-02-22 13:38:45

VSFTPD

2020-04-09 13:38:40

MySQL數據庫臟讀

2019-08-15 10:20:19

云計算技術安全

2011-05-05 10:32:54

激光打印機

2012-12-12 09:49:41

點贊
收藏

51CTO技術棧公眾號

日韩欧美猛交xxxxx无码| 国产精品视频免费观看www| zjzjzjzjzj亚洲女人| av影视在线看| 久久综合国产精品| 国产精品欧美日韩久久| 久久久国产精华液| 国产传媒欧美日韩成人精品大片| 欧美日韩一区二区不卡| 日本免费成人网| 久草福利在线视频| 国产精品主播直播| 欧美一级视频一区二区| 精品视频第一页| 久久人人爽人人爽人人片av不| 色猫猫国产区一区二在线视频| 天天干天天色天天爽| 亚洲AV成人无码一二三区在线| 精品一区二区精品| 国产69精品久久久久久| 91视频综合网| 女人抽搐喷水高潮国产精品| 在线成人午夜影院| 日韩精品在线中文字幕| 青青青青在线| 久久亚洲综合色一区二区三区 | 老司机午夜网站| 男操女在线观看| 成人av电影在线| 91在线视频九色| 日本黄色中文字幕| 一区二区久久| 久久青草福利网站| 全网免费在线播放视频入口| 欧美日韩第一| 日韩精品在线视频观看| 久久久久久无码精品人妻一区二区| 桃色一区二区| 黑人精品xxx一区一二区| 国产在线拍揄自揄拍无码| 成人资源www网在线最新版| 99国产欧美久久久精品| 国产一区免费观看| 午夜久久久久久久久久| 狠狠色伊人亚洲综合成人| 国产精品jvid在线观看蜜臀| 日本网站在线播放| 亚洲欧洲一区二区天堂久久| 欧美日韩成人免费| 69av视频在线| 欧美福利网址| 久久99久久99精品中文字幕 | 久久一区二区中文字幕| 亚洲一级一级97网| 欧美做受xxxxxⅹ性视频| 中文字幕av一区二区三区人| 亚洲女在线观看| 中文字幕在线看高清电影| 久久99国内| 亚洲品质视频自拍网| 亚洲区免费视频| 精品国产乱码久久久久久1区2匹| 国产性猛交xxxx免费看久久| 免费人成又黄又爽又色| 成人国产精品一级毛片视频| 中文字幕av一区| 久久成人小视频| 亚洲国产精品久久久久蝴蝶传媒| 欧美成人精品在线视频| 精品人妻在线播放| 一本色道久久综合亚洲精品不| 午夜精品视频在线| 黄色在线免费观看| 奇米色777欧美一区二区| 国产综合久久久久| 超碰在线播放97| 不卡的av中国片| 日韩av图片| 国产人成网在线播放va免费| 亚洲精品美国一| 波多野结衣家庭教师在线| 极品美女一区| 欧美喷水一区二区| 国产成人av片| 亚洲男人都懂第一日本| 日韩日本欧美亚洲| 日本在线观看视频网站| 丝瓜av网站精品一区二区| 91亚洲精品在线观看| 日批视频免费播放| 国产欧美精品一区二区色综合朱莉| 宅男一区二区三区| 国产偷倩在线播放| 91福利区一区二区三区| 想看黄色一级片| 国产精品久久久久久久久久白浆| 亚洲国产成人精品一区二区| 色欲AV无码精品一区二区久久| 亚洲女同一区| 欧美专区日韩视频| 国产精品久久无码一三区| 99精品桃花视频在线观看| 一本久道久久综合狠狠爱亚洲精品| 特级毛片在线| 欧美亚洲国产一区二区三区va| 中文字幕55页| 日韩av在线播放网址| 久久久女女女女999久久| 日本成人一级片| 成人精品亚洲人成在线| 在线丝袜欧美日韩制服| 欧美大胆成人| 亚洲国语精品自产拍在线观看| 日本高清黄色片| 亚洲国产欧美国产综合一区| 国产啪精品视频| 天天干天天爽天天操| 椎名由奈av一区二区三区| 国产精品亚洲a| 国产精品极品在线观看| 久久伊人精品天天| 日本熟妇一区二区三区| av成人免费在线| 日韩亚洲欧美一区二区| 国产香蕉久久| 亚洲欧美日韩网| 亚洲黄色三级视频| 国产成人综合自拍| 日韩视频在线免费播放| 日韩一区二区三区四区五区| 亚洲色图第三页| 亚洲GV成人无码久久精品| 不卡av在线网| av在线播放天堂| 99er精品视频| 久久精品亚洲精品| 亚洲一区中文字幕在线| 欧美极品另类videosde| 日本熟妇人妻xxxxx| 色橹橹欧美在线观看视频高清| 欧美黑人一级爽快片淫片高清| 国产又粗又大又爽视频| 国产精品日韩精品欧美在线| 超碰在线播放91| 成人3d动漫在线观看| 日本一区二区三区四区视频| 日韩亚洲视频在线观看| 色婷婷综合激情| 国产美女免费无遮挡| 久久九九国产| 午夜精品一区二区三区四区| 亚洲第一会所| 色噜噜国产精品视频一区二区| 国产主播第一页| 中文字幕欧美日本乱码一线二线| 亚洲成人福利在线观看| 激情综合网五月| 国产精品人成电影| 日本免费中文字幕在线| 制服.丝袜.亚洲.另类.中文 | 亚洲曰韩产成在线| 国产精久久久久| 亚洲精品美女91| 女同一区二区| 欧美美女福利视频| 久久九九亚洲综合| 亚洲成人777777| 五月综合激情网| 国产熟妇久久777777| 久久精品国产秦先生| 国产性生活免费视频| 国产精品色呦| 国产97色在线| 国内精品久久久久久野外| 欧美videos大乳护士334| xxxx.国产| 国产精品私人自拍| 欧美xxxx黑人| 噜噜噜躁狠狠躁狠狠精品视频| 一区二区高清视频| 国产成人精品福利| 国产精品99久久久久久久久| 国产激情在线视频| 日韩av在线一区| 最近日韩免费视频| 亚洲永久免费视频| 在线免费观看日韩av| 久久66热re国产| av高清在线免费观看| 欧美日韩国产高清电影| 国产91社区| 岛国一区二区| 欧美激情精品久久久久久黑人| 可以直接在线观看的av| 欧美一区二区三区色| 亚洲精品午夜国产va久久成人| 国产精品国产三级国产普通话三级 | 久久久久久久9999| 久久亚洲精华国产精华液| 手机av在线网| 亚洲综合另类| 五月天激情图片| 国产探花一区二区| 国产精品美女诱惑| 欧美综合影院| 日韩av免费网站| 黑人极品ⅴideos精品欧美棵| 在线观看91久久久久久| 神马午夜电影一区二区三区在线观看| 欧美色视频在线| 在线观看亚洲天堂| 亚洲男帅同性gay1069| 男人舔女人下部高潮全视频| 成人精品一区二区三区中文字幕| 亚洲 激情 在线| 麻豆91精品| 黄色一级在线视频| 欧美精品国产一区| 一区二区高清视频| 欧美老女人另类| 精品免费国产| 超碰97久久| 国产精品自产拍在线观看中文 | 精品国产成人在线| 538精品在线观看| 亚洲欧美在线高清| 91精品久久久久久久久久久久| 99精品视频免费在线观看| 婷婷中文字幕在线观看| 免费黄网站欧美| 妺妺窝人体色www在线观看| 亚洲欧洲午夜| 2018日日夜夜| 在线免费观看欧美| www.国产在线播放| 黄色国产精品| 国产乱人伦精品一区二区三区| 91一区二区三区四区| 欧美成人免费在线| 猛男gaygay欧美视频| 九九久久99| 欧美理论电影在线精品| 久久99精品久久久久久三级 | 日韩精品国产一区二区| 亚洲女爱视频在线| 可以免费看av的网址| 国产精品视频你懂的| 欧美亚洲色综久久精品国产| 国产精品久久久久永久免费观看| 欧美人妻一区二区三区| 欧美国产日韩一二三区| 日韩欧美黄色网址| 国产精品青草久久| 成人一级黄色大片| 亚洲欧美日韩中文播放| 澳门黄色一级片| 亚洲在线免费播放| 自拍偷拍欧美亚洲| 欧美性猛交xxxx免费看漫画| 国产一级片av| 欧美日韩一级大片网址| 国产又大又黄的视频| 日韩欧美亚洲另类制服综合在线| 午夜精品一二三区| 日韩电影视频免费| 久久这里精品| 爽爽爽爽爽爽爽成人免费观看| 久久精品视频免费看| 欧美国产日产韩国视频| 乡村艳史在线观看| 国产成人一区三区| 日韩综合av| av一区二区在线看| 要久久爱电视剧全集完整观看| 性欧美.com| 午夜精品亚洲| 男女午夜激情视频| 久久成人免费日本黄色| 极品白嫩少妇无套内谢| 91小视频在线| 手机免费观看av| 亚洲一级不卡视频| 国产www在线| 91精品综合久久久久久| 欧美熟妇交换久久久久久分类| 国产一区二区av| 免费网站在线观看人| 日韩av观看网址| 天堂精品在线视频| 欧洲一区二区日韩在线视频观看免费 | 国产精品成人免费观看| 一本久久a久久精品亚洲| 国产精品一区二区av白丝下载| 亚洲黄色在线观看| 欧美精品videos另类| 91精品国产色综合久久不卡98口| 91综合国产| 国产在线精品日韩| 91视频综合| www.com毛片| 国产经典欧美精品| 精品成人无码一区二区三区| 一区二区成人在线| 国产精品高清无码| 亚洲黄一区二区| 国内精品久久久久久野外| 欧美中文字幕在线| 日韩欧美一级| 亚洲欧美日韩另类精品一区二区三区| 亚洲大胆视频| 超碰中文字幕在线观看| 亚洲国产成人午夜在线一区| 青青草成人av| 日韩一级片网站| 在线免费观看的av网站| 欧美亚洲国产日本| 亚洲一区二区三区在线免费| 亚洲国产欧美不卡在线观看| 激情国产一区| 日本中文字幕有码| 亚洲欧美怡红院| 97人妻精品视频一区| 日韩精品在线视频观看| 大桥未久在线视频| 懂色一区二区三区av片| 亚洲国产精品成人| 伊人成人222| 国产精品久久毛片a| 久久久精品毛片| 国产视频久久久| 国模精品视频| 国产伦精品一区二区三区在线 | 蜜桃91麻豆精品一二三区| 日韩中文字幕视频在线观看| 国产成+人+综合+亚洲欧美| 欧美精品一区二区三区四区五区| 99国产一区| 丰满大乳奶做爰ⅹxx视频| 婷婷丁香久久五月婷婷| 丰满人妻一区二区三区四区53| 久久综合亚洲社区| 日韩深夜福利网站| 日韩一本精品| 日韩电影在线一区二区| 欧美黄色一级生活片| 在线视频欧美精品| 精品美女视频在线观看免费软件| 日本欧美一级片| 欧美精品第一区| 国产视频一区二区视频| 国产区在线观看成人精品| 青青艹在线观看| 这里只有视频精品| 2020国产精品小视频| 中国黄色录像片| 国产福利一区二区三区视频 | 成人在线免费网站| 伊人成人在线视频| 精品中文字幕在线播放| 欧美日韩性生活视频| 日本午夜在线| 国产精品普通话| 午夜激情久久| 国产一级二级av| 天天影视涩香欲综合网| 极品美乳网红视频免费在线观看| 国产福利视频一区二区| 四虎8848精品成人免费网站| 1314成人网| 黑人巨大精品欧美一区二区一视频| 欧美xxx.com| 国产日韩中文在线| 亚洲五月综合| 日韩精品人妻中文字幕有码| 色婷婷综合在线| av女优在线| 97久久夜色精品国产九色| 国产手机视频一区二区 | jlzzjlzz亚洲女人| 成年网站免费在线观看| 亚洲高清三级视频| 国产在线一二| 亚洲xxxx视频| 久久精品国产清高在天天线| 三上悠亚作品在线观看| 亚洲精品美女免费| 成人黄色视屏网站| 欧美日韩中文字幕在线播放| 91免费国产在线观看| 国产又大又黄又爽| 97免费在线视频| 日韩一区二区在线| 日本三级日本三级日本三级极| 欧美日韩精品一区视频| 岛国av在线网站| 中文字幕一区综合| 91网站最新网址| 超碰免费在线97| 国产欧美精品一区二区| 国产精品久久久久久模特 |