<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    講講 Linux 下的一些資源限制

    VSole2021-09-19 07:08:00

    前言

    在我們寫程序的時候往往都沒有注意到一些系統資源的臨界值,然而這些臨界值在有的時候會把我們害的很慘,比如一個忘掉關閉的文件描述符,比如malloc竟然會返回錯誤,又或者是爆棧,我們該如何解決或者說預防這些問題呢?

    以下實驗僅在本機的系統環境下生效:

    用戶層面資源限制

    ulimit 命令可以查看用戶層面的系統資源限制。這是在 /etc/security/limits.conf 的描述:

    -----------------------------------------------------

    該文件為通過PAM登錄的用戶設置資源限制。

    它不會影響系統服務的資源限制。

    還要注意 /etc/security/limits.d 目錄中的配置文件,以字母順序閱讀的內容,請覆蓋此設置域相同或更具體的情況下使用文件。

    例如,這意味著在此處設置通配符域的限制可以使用配置文件中的通配符設置覆蓋子目錄,但此處的用戶特定設置只能被覆蓋在子目錄中具有特定于用戶的設置。

    -----------------------------------------------------

    所以 ulimit 的確是觀察用戶層面的資源限制。

    我們可以通過 ulimit -a 查看我們所有的資源上限:

    只說其中我們比較關注的那些:

    -s 棧大小:8MB

    -u 進程上限:30000多

    -n 文件描述符上限:1024

    同時你可以用ulimit -Ha或ulimit -Sa查看硬限制和軟限制,硬限制是指對資源節點和數據塊的絕對限制,由 root 用戶設置硬限制。雖然其他用戶可以降低硬限制,但只有 root 用戶可以增加硬限制。至于軟限制,網上資料也沒有說什么,大概就是非root用戶不能超過軟限制,但是非root用戶可以做的是將其軟限制增加到其硬限制。

    我們的服務器程序可能有打開超過1024個文件描述符,有沒有辦法修改這些資源的上限呢?

    E.g. ulimit -n 1024可以修改系統對文件描述符的限制,不過是臨時當前的shell生效的,如果你使用which ulimit你會發現ulimit是一個shell built-in command的腳本。

    我們應該修改 /etc/security/limits.conf 去讓我們的修改永久生效。(需要重新啟動,可能有直接加載配置的方法,暫時不知道)

    實驗1. 修改文件描述符上限

    在/etc/security/limits.conf中添加以下片段:

    重啟后,然后查看一下資源是否真的被修改了:

    說明修改成功。那么現在我們測試下我們的程序能否打開這么多個文件描述符?做個小測試,下面就是打開10240個臨時文件,這里我們期待錯誤 EFILE:

    接著我們看一下結果:

    在修改之前是ulimit的默認值是1024,然后測試出的最大打開文件描述符的數量是1001,現在是修改為10240后可以打開10217個文件描述符,實驗成功。然后我們能打開的總數為什么不是剛好10240呢?這個問題是因為程序自身打開了一些文件或是加載了一些動態庫,stdin/stdout/stderr,以及 /etc/ld.so.cache,/usr/lib/libm.so.6,/usr/lib/libstdc++.so.6...

    實驗2. 修改棧空間上限

    同樣還是在/etc/security/limits.conf添加這樣兩句:

    然后在c程序中測試棧幀的上限:

    程序正常。將棧調到臨界值:

    程序發生段錯誤。

    但這里也只能保守的說:調整以后的一個進程的棧空間大概在 8192000B 這附近。

    系統層面資源限制

    單個進程打開文件句柄數上限 最大文件描述符數 10億。

    系統分配的pid上限是400多萬。

    file-max是在內核級別強制執行的最大文件描述符(FD),上限600萬。

    已分配的文件文件描述符數,已分配但未使用的文件描述符數以及最大文件描述符數(不可調)。

    系統全局的總線程數限制為6萬。

    單個程序所能使用內存映射空間的數量為6萬。

    可以創建的線程的總數和這些有關:

    一個進程的資源限制

    redis中文件描述符上限的調整

    你覺得資源限制和你沒有關系?在你打開 redis-server 的時候,難道就沒有注意到這樣的一段:

    Increased maximum number of open files to 10032 (it was originally set to 1024).

    其含義就是將文件描述符從默認的上限調整到10032,為了適應更多的網絡連接。

    其源碼中也不過是調用了api:

    setrlimit(RLIMIT_NOFILE,&limit)

    去進行了資源上限的臨時調整,此處不細講。

    prlimit

    最后介紹另外一個類似ulimit的命令prlimit:

    結語

        linux的資源限制不能說很奇妙吧,但確實值得做linux服務端編程的程序員們需要注意,同時我們可以通過在 /etc/security/limits.conf 去修改資源的上限。忽然想到上次問學長:為什么linux下需要對這些資源進行限制?都調整為ulimited不是很好么?

        可以說我們的linux機器之所以限制這些資源的上限,是希望我們能夠充分利用它,把它的性能發揮到極致,而不是讓CPU或者文件等資源在那里閑置著,浪費計算機的生命。

    原文地址:https://adlternative.github.io/resource-limit/
    linux服務器文件描述符
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    Linux是一種開源操作系統,它支持各種硬件平臺,Linux服務器全球知名,它和Windows之間最主要的差異在于,Linux服務器默認情況下一般不提供GUI(圖形用戶界面),而是命令行界面,它的主要目的是高效處理非交互式進程,響應時間并不是那么重要,相反,能夠長時間處理高負載才是最關鍵的。
    Linux高可用服務器集群解決方案讓IT系統管理員可以從容應對許多常見的硬件和軟件故障,允許多臺計算機一起工作,為關鍵服務正常運行提供保障,系統管理員可以不中斷服務執行維護和升級。Linux功能豐富、強大、靈活,你可以用它完成各種任務,在這篇文章中,我們將討論一些提高Linux服務器性能的技巧。
    在tcp應用中,server事先在某個固定端口監聽,client主動發起連接,經過三次握手后建立tcp連接。所以,對server端,通過增加內存、修改最大文件描述符個數等參數,單機最大并發TCP連接數超過10萬,甚至上百萬是沒問題的。這明顯是進入了思維的誤區,65535是指可用的端口總數,并不代表服務器同時只能接受65535個并發連接。能夠唯一標示網絡中的進程后,它們就可以利用socket進行通信了。因此,65535代表Linux系統支持的TCP端口號數量,在TCP建立連接時會使用。
    背景 隨著開源產品的越來越盛行,作為一個安全工程師,能夠清晰地鑒別異常機器是否已經被入侵了顯得至關重要,個人結合自己的工作經歷,整理了幾種常見的機器被黑情況僅供參考~ ?以下情況是在CentOS 6.9的系統中查看的,其它Linux發行版類似。
    在tcp應用中,server事先在某個固定端口監聽,client主動發起連接,經過三路握手后建立tcp連接。所以,對server端,通過增加內存、修改最大文件描述符個數等參數,單機最大并發TCP連接數超過10萬,甚至上百萬是沒問題的。這明顯是進入了思維的誤區,65535是指可用的端口總數,并不代表服務器同時只能接受65535個并發連接。能夠唯一標識網絡中的進程后,它們就可以利用socket進行通信了。因此,65535代表Linux系統支持的TCP端口號數量,在TCP建立連接時會使用。
    反彈shell的N種姿勢
    2021-09-26 09:00:48
    在滲透測試的過程中,在拿到webshell以后,如果目標主機是Windows主機,則是通過開3389端口在遠程連接,如果目標主機是linux服務器,一般我們都會選擇反彈shell來進行操作。在這里總結下反彈shell常見的幾種姿勢。
    隨著開源產品的越來越盛行,作為一個Linux運維工程師,能夠清晰地鑒別異常機器是否已經被入侵了顯得至關重要,個人結合自己的工作經歷,整理了幾種常見的機器被黑情況供參考
    3-服務器入侵排查
    2022-05-03 07:14:09
    隨著開源產品的越來越盛行,作為一個Linux運維工程師,能夠清晰地鑒別異常機器是否已經被入侵了顯得至關重要,個人結合自己的工作經歷,整理了幾種常見的機器被黑情況供參考:
    服務器入侵排查
    2023-05-08 11:21:27
    大多數與 lsof 相關的信息都存儲于以進程的 PID 命名的目錄中,即 /proc/1234 中包含的是 PID 為 1234 的進程的信息。lsof 程序使用該信息和其他關于內核內部狀態的信息來產生其輸出。所以lsof 可以顯示進程的文件描述符和相關的文件名等信息。
    CentOS服務器入侵排查
    2022-08-29 14:32:36
    大多數與 lsof 相關的信息都存儲于以進程的 PID 命名的目錄中,即 /proc/1234 中包含的是 PID 為 1234 的進程的信息。lsof 程序使用該信息和其他關于內核內部狀態的信息來產生其輸出。所以lsof 可以顯示進程的文件描述符和相關的文件名等信息。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类