<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## Linux 容器中用來實現“隔離”的技術手段--Namespace `Namespace `技術實際上修改了應用進程看待整個計算機“視圖”,即它的“視線”被操作系統做了限制,只能“看到”某些指定的內容。但對于宿主機來說,這些被“隔離”了的進程跟其他進程并沒有太大區別。 ![](https://box.kancloud.cn/7639eca2186228ccbb601c06d2ee531d_1834x994.png) 用戶運行在容器里的應用進程,跟宿主機上的其他進程一樣,都由宿主機操作系統統一管理,只不過這些被隔離的進程擁有額外設置過的 Namespace 參數。而 Docker 項目在這里扮演的角色,更多的是**旁路式的輔助和管理工作**。 而相比之下,容器化后的用戶應用,卻依然還是一個宿主機上的普通進程,這就意味著這些因為虛擬化而帶來的性能損耗都是不存在的;而另一方面,使用 Namespace 作為隔離手段的容器并**不需要單獨的 Guest OS**,這就使得容器額外的資源占用幾乎可以忽略不計。所以說,**“敏捷”和“高性能”**是容器相較于虛擬機最大的優勢,也是它能夠在 PaaS 這種更細粒度的資源管理平臺上大行其道的重要原因。 ## 不足 有利就有弊,基于 Linux Namespace 的隔離機制相比于虛擬化技術也有很多不足之處,其中最主要的問題就是:隔離得不徹底。 * 首先,既然容器只是運行在宿主機上的一種特殊的進程,那么多個容器之間使用的就還是同一個宿主機的操作系統內核。 * 其次,在 Linux 內核中,有很多資源和對象是不能被 Namespace 化的,最典型的例子就是:時間。 這就意味著,如果你的容器中的程序使用 settimeofday(2) 系統調用修改了時間,整個宿主機的時間都會被隨之修改,這顯然不符合用戶的預期。相比于在虛擬機里面可以隨便折騰的自由度,在容器里部署應用的時候,“什么能做,什么不能做”,就是用戶必須考慮的一個問題。此外,由于上述問題,尤其是共享宿主機內核的事實,容器給應用暴露出來的攻擊面是相當大的,應用“越獄”的難度自然也比虛擬機低得多。 在生產環境中,沒有人敢把運行在物理機上的 Linux 容器直接暴露到公網上。當然,**基于虛擬化或者獨立內核技術的容器實現**,則可以比較好地在隔離與性能之間做出平衡。 ## 資源限制--cgroup Linux Cgroups 的全稱是 Linux Control Group。它最主要的作用,就是限制一個進程組能夠使用的資源上限,包括 CPU、內存、磁盤、網絡帶寬等等。 在 Linux 中,Cgroups 給用戶暴露出來的操作接口是文件系統,即它以文件和目錄的方式組織在操作系統的 /sys/fs/cgroup 路徑下。在 Ubuntu 16.04 機器里,我可以用 mount 指令把它們展示出來,這條命令是 mount -t cgroup。 ``` /sys/fs/cgroup/cpu/container $ ls cgroup.clone_children cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat tasks ``` ### 對某個進程做 CPU 的限制 ``` $ while : ; do : ; done & [1] 226 $ cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us -1 $ cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us 100000 向 container 組里的 cfs_quota 文件寫入 20 ms(20000 us): $ echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us 接下來,我們把被限制的進程的 PID 寫入 container 組里的 tasks 文件,上面的設置就會對該進程生效了: echo 226 > /sys/fs/cgroup/cpu/container/tasks ``` 而至于在這些控制組下面的資源文件里填上什么值,就靠用戶執行 docker run 時的參數指定了,比如這樣一條命令: ``` $ docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash ``` ## 不足 眾所周知,Linux 下的 /proc 目錄存儲的是記錄當前內核運行狀態的一系列特殊文件,用戶可以通過訪問這些文件,查看系統以及當前正在運行的進程的信息,比如 CPU 使用情況、內存占用率等,這些文件也是 top 指令查看系統信息的主要數據來源。 但是,你如果在容器里執行 top 指令,就會發現,它顯示的信息居然是宿主機的 CPU 和內存數據,而不是當前容器的數據。造成這個問題的原因就是,/proc 文件系統并不知道用戶通過 Cgroups 給這個容器做了什么樣的資源限制,即:/proc 文件系統不了解 Cgroups 限制的存在。 你是否知道如何修復容器中的 top 指令以及 /proc 文件系統中的信息呢?(提示:lxcfs)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看