AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 671259
Accepted
Philip Couling
Philip Couling
Asked: 2021-10-01 03:12:06 +0800 CST2021-10-01 03:12:06 +0800 CST 2021-10-01 03:12:06 +0800 CST

Os contêineres do docker compartilham RAM para memória de arquivos mapeados da mesma camada, mas de uma imagem diferente?

  • 772

Não tenho 100% de certeza se esta é uma pergunta U&L ou SO . No geral, estou postando no U&L, pois é relacionado ao sistema operacional .

Fundo

Até onde eu sei, o Linux carregará bibliotecas compartilhadas (arquivos .so) mapeando-as na memória como copy-on-write. Uma vantagem disso é que vários processos que compartilham a mesma biblioteca grande compartilharão a mesma RAM física para grande parte do conteúdo dessa biblioteca.

Isso não acontece necessariamente com o Docker porque os processos são executados em seu próprio "contêiner" com base em uma "imagem" e cada imagem contém sua própria cópia de bibliotecas compartilhadas. Isso é deliberado. Ele permite que os programas sejam enviados com suas próprias dependências (bibliotecas) que podem ser substancialmente diferentes das bibliotecas já instaladas no sistema.

Portanto, um programa executado nativamente em um host do Docker não compartilhará a mesma memória para bibliotecas que um programa executado em um contêiner do Docker porque o programa no contêiner do Docker foi mapeado para diferentes cópias das bibliotecas.

Camadas do Docker explicadas

As imagens do Docker são criadas em camadas. Cada camada adiciona à inferior, às vezes substituindo os arquivos existentes. Nem todo arquivo é alterado em todas as camadas.

O Docker permite criar novas imagens adicionando novas camadas a uma imagem mais antiga. Quando isso acontece, você acaba com várias imagens compartilhando as mesmas camadas. As imagens compartilham cópias idênticas de alguns dos mesmos arquivos.

O Docker mantém as camadas separadamente, pelo menos antes do tempo de execução. Por exemplo: ao puxar uma imagem do Docker Hub, o Docker busca as imagens buscando as camadas constituintes de cada imagem. Ele apenas busca as camadas que ainda não possui.

O que eu não sei

Ao criar ou executar um contêiner, o Docker deve montar as camadas em um único sistema de arquivos coerente. Não sei como faz isso. Poderia:

  • Copie os arquivos em um só lugar
  • Crie links físicos em um só lugar
  • Use um sistema de arquivos de sobreposição

Dependendo do que ele faz, os arquivos originados da mesma camada podem ser cópias idênticas ou podem ser exatamente o mesmo arquivo no sistema de arquivos.

Em última análise, isso afetará o que acontece quando os arquivos são mapeados na memória por vários processos.

O que estou realmente tentando descobrir?

Eu quero saber se a execução de dois contêineres de duas imagens diferentes compartilhará a mesma RAM para uma única biblioteca compartilhada originada em uma única camada.

docker mmap
  • 1 1 respostas
  • 736 Views

1 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2021-10-01T03:44:21+08:002021-10-01T03:44:21+08:00

    Pelo menos em algumas configurações, sim, os containers podem compartilhar mapeamentos de memória para arquivos da mesma camada em imagens diferentes.

    Aqui está um experimento para demonstrar isso. Estou usando duas imagens diferentes, uma baseada na outra:

    $ docker history 5f35156022ae
    IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
    5f35156022ae   7 weeks ago    COPY scripts/shared/ . # buildkit               1.05MB    buildkit.dockerfile.v0
    <missing>      7 weeks ago    WORKDIR /opt/shipyard/scripts                   0B        buildkit.dockerfile.v0
    ...
    
    $ docker history 569bf4207a08
    IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
    569bf4207a08   7 weeks ago    /bin/sh -c #(nop)  CMD ["sh"]                   0B        
    ed9510deb54e   7 weeks ago    /bin/sh -c #(nop)  ENTRYPOINT ["/opt/shipyar…   0B        
    c3e0351f0dd2   7 weeks ago    /bin/sh -c #(nop) WORKDIR /go/src/github.com…   0B        
    a476f9f2b118   7 weeks ago    /bin/sh -c #(nop)  ENV DAPPER_OUTPUT=/go/src…   0B        
    29a76c4ff3e7   7 weeks ago    /bin/sh -c #(nop)  ENV DAPPER_ENV=QUAY_USERN…   0B        
    2f4a590d61ef   7 weeks ago    /bin/sh -c #(nop)  ARG PROJECT                  0B        
    5f35156022ae   7 weeks ago    COPY scripts/shared/ . # buildkit               1.05MB    buildkit.dockerfile.v0
    <missing>      7 weeks ago    WORKDIR /opt/shipyard/scripts                   0B        buildkit.dockerfile.v0
    ...
    

    Eu iniciei dois contêineres, apenas usando o shell do ponto de entrada:

    $ pstree -p
    ...
               ├─containerd-shim(530457)─┬─bash(530477)
               │                         ├─{containerd-shim}(530458)
    ...
               ├─containerd-shim(530622)─┬─entry(530643)───sh(530685)
               │                         ├─{containerd-shim}(530624)
    ...
    

    Vamos examinar a biblioteca C usada por esses dois shells:

    $ sudo grep libc-2.33 /proc/{530477,530685}/maps
    /proc/530477/maps:7fc127f81000-7fc127fa7000 r--p 00000000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530477/maps:7fc127fa7000-7fc1280f4000 r-xp 00026000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530477/maps:7fc1280f4000-7fc128140000 r--p 00173000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530477/maps:7fc128140000-7fc128141000 ---p 001bf000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530477/maps:7fc128141000-7fc128144000 r--p 001bf000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530477/maps:7fc128144000-7fc128147000 rw-p 001c2000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530685/maps:7f6a5df94000-7f6a5dfba000 r--p 00000000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530685/maps:7f6a5dfba000-7f6a5e107000 r-xp 00026000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530685/maps:7f6a5e107000-7f6a5e153000 r--p 00173000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530685/maps:7f6a5e153000-7f6a5e154000 ---p 001bf000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530685/maps:7f6a5e154000-7f6a5e157000 r--p 001bf000 00:1f 3117                       /usr/lib64/libc-2.33.so
    /proc/530685/maps:7f6a5e157000-7f6a5e15a000 rw-p 001c2000 00:1f 3117                       /usr/lib64/libc-2.33.so
    

    Ambas as bibliotecas mapeadas têm o mesmo dispositivo e inode, portanto, são o mesmo arquivo e seus mapeamentos serão compartilhados sempre que possível.

    • 2

relate perguntas

  • incapaz de extrair imagens no kubernetes do registro privado

  • Conectando-se a um host docker!

  • Qual é o propósito da instrução VOLUME em um Dockerfile?

  • Como instalo o docker no RHEL 7 offline?

  • Preciso executar este arquivo de script apenas uma vez?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve