簡體   English   中英

Redis 中打開的文件太多

[英]too many open files in Redis

在我們的項目中,我們使用了一個總內存為 4 GB 的 Redis 實例(托管在 GCP 上),其中目前僅使用了 2 GB。 總連接數限制為 1000。幾天前,我們在從 Redis 緩存讀取時發現了一個意外錯誤(持續了幾分鍾)——“dial tcp xx.xx.xx.xx:6379: socket: too many open files”

現在,我檢查了 Redis 的 CPU 使用率和內存使用率都沒有激增,redis 實例也沒有出現故障。 幾分鍾后,該錯誤自動消失。 雖然看起來這個錯誤是指同時打開的大量連接。 我檢查了默認連接池大小(如果有的話),我在 go-redis 庫(我們正在使用的)的官方文檔中觀察到:

為了提高性能,go-redis 會自動管理一個網絡連接池(sockets)。 默認情況下,每個可用 CPU 的池大小為 10 個連接,由 runtime.GOMAXPROCS 報告。 在大多數情況下,這已經綽綽有余,調整它很少有幫助。

所以,我無法理解是什么導致了這個問題以及如何解決它(如果它將來再次出現)? 有人可以幫忙嗎?

這不是 Redis 的問題,它可能是您的代碼中的問題。

Linux 中的進程對它們施加了限制,一個限制是進程一次可以擁有的“打開文件描述符”的數量。

文件描述符由進程創建,以使進程能夠訪問資源並對其執行操作,例如對其進行讀/寫。 文件描述符不僅代表您認為的磁盤上的傳統“文件”,它還用於代表程序可以讀取/寫入的網絡套接字。

在您的情況下,您會看到: "dial tcp xx.xx.xx.xx:6379: socket: too many open files"

您的程序試圖打開一個到 redis 的新網絡連接,這樣做時,它必須創建一個套接字,這需要使用文件描述符。 您返回“打開的文件過多”的錯誤是由於達到此限制。

你可以做兩件事

  1. 提高這個限制,去閱讀ulimit https://ss64.com/bash/ulimit.html或者搜索你的錯誤,很多結果。
  2. 調查為什么你有太多打開的文件。

第二部分可能表明您正在打開文件/套接字,而不是關閉它們,從而導致您“泄漏”描述符。 例如,如果每次查詢 Redis 時都打開一個從未關閉的新連接,最終會用完文件描述符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM