簡體   English   中英

如何將更多 memory 分配給運行 gcc 命令的 docker 容器?

[英]How allocate more memory to my docker container running the gcc command?

我必須編譯包含 python function 的 C 代碼。 我有一台 Ubuntu 19 64 位機器,我需要為運行 raspbian 拉伸的樹莓派 3model b+ 編譯 C 代碼。 為此,我按照https://raspberrypi.stackexchange.com/a/109524/116139創建了一個帶有我需要的拉伸版本的 docker 容器。 我的 docker stats是:


CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %                 NET I/O             BLOCK I/O           PIDS
14b303f257da        DOCKER_CONTAINER   0.00%               13.68MiB / 7.776GiB   0.17%               6.51MB / 26.6kB     19.4MB / 41kB       2

在容器環境中,運行top

    1 root      20   0 4241352  12308   4892 S  0.0  0.2   0:00.50 bash         
  133 root       0   0 4241096  12048   4972 R  0.0  0.1   0:00.00 top 

此外,運行df -h

Filesystem      Size  Used Avail Use% Mounted on
overlay          30G   21G  7.6G  74% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda1        30G   21G  7.6G  74% /etc/hosts
tmpfs           3.9G     0  3.9G   0% /proc/asound
tmpfs           3.9G     0  3.9G   0% /proc/acpi
tmpfs           3.9G     0  3.9G   0% /proc/scsi
tmpfs           3.9G     0  3.9G   0% /sys/firmware

所以,我給了你關於我系統的所有記憶信息。 我的 gcc 命令在編譯我的大型 C 代碼時用完了 memory 代碼:

gcc -Os $(python3-config --cflags --ldflags) CCODE.c -o EXECUTABLE_CODE 

cc1: out of memory allocating 66660800 bytes after a total of 290631680 bytes

在 RPi4(4GB RAM)中僅運行gcc命令(沒有 docker)它可以工作(在 RPi3b+、1GB RAM 上,它無法報告cc1: out of memory )。 但是,我需要 RPi3,不幸的是它有不同的操作系統。 我被困在這個問題上好幾個星期了。 有人有任何提示或不同的解決方案嗎? 謝謝指教。

你可以嘗試交叉編譯你的代碼來解決這個問題。

對於工具鏈,您可以使用Crosstool-NG 讓 Python 進行交叉編譯需要更多的工作,我不會在這里詳細介紹 go。 我將向您推薦我使用的Dockerfileshell 腳本 您可以在此處找到有關它們的更多信息。

出於此答案的目的,我將使用我自己構建的 Docker 圖像。 它們可從 Docker 集線器獲得。 如果您願意,您當然可以自己構建它們,源代碼在我之前鏈接到的 GitHub 存儲庫中可用。 如果您不需要 NumPy 和 OpenCV,請務必在 Dockerfile 中將所有這些注釋掉,因為交叉編譯需要很長時間。

我使用的工具鏈適用於 Linux 4.15 及更高版本。 如果你使用 Raspbian Stretch,它的 kernel 可能太舊了。 不過,它應該適用於 Raspbian Buster 和 Ubuntu 18.04 及更高版本。 如果您真的想使用 Stretch,則必須按照此處的說明編輯工具鏈配置文件並自己構建工具鏈。 Python 版本也是如此。 默認情況下,它使用 Python 3.8.2。


1.准備你的工作目錄

准備一個文件夾,其中包含您要交叉編譯的所有代碼。 如果您有可以輕松移動的外部依賴項,請將它們也放在文件夾中。 稍后我們將把這個文件夾掛載到 Docker 容器中。

2.在一個小的shell腳本中編寫構建命令

創建一個build-docker.sh文件,其中包含您要在 Docker 容器中執行的任何命令來構建您的代碼。

set -ex
PY_CONFIG="${RPI_SYSROOT}/usr/local/bin/python3.8-config"
OPTS=$(${PY_CONFIG} --cflags --ldflags)
CC=${HOST_TRIPLE}-gcc
${CC} ${OPTS} CCODE.c -o EXECUTABLE_CODE

請注意我是如何在 Raspberry Pi 的 sysroot 文件夾中使用python3.8-config腳本的。 如果你只使用python3.8-config而不指定完整路徑,它將使用構建機器的 Python 安裝的配置,這不是你想要的。

您還需要指定交叉編譯器。 同樣,如果您只編寫gcc ,它使用構建系統的本機 x86_64 編譯器。 您需要 ARM 交叉編譯器。

3.運行Docker容器中的腳本

您的工作目錄現在應該如下所示:

.
├── build-docker.sh
└── CCODE.c

現在我們將使用必要的交叉編譯工具啟動一個 Docker 容器,將工作目錄掛載到其中,這樣您就可以訪問您的CCODE.c ,並在我們剛剛編寫的腳本中運行構建命令。

docker run \
    --rm \
    -it \
    -v "$PWD:/tmp/workdir" \
    -w "/tmp/workdir" \
    tttapa/rpi-cross:armv8-rpi3-linux-gnueabihf \
    "bash" "build-docker.sh"

第一次運行它時,它會從 Docker Hub 拉取圖像,因此需要一些時間(超過 GiB)。

構建完成后,您應該在工作目錄中留下一個文件EXECUTABLE_CODE

$ file EXECUTABLE_CODE
EXECUTABLE_CODE: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),
dynamically linked, interpreter /lib/ld-linux-armhf.so.3,
for GNU/Linux 4.15.18, with debug_info, not stripped

您可以在此處找到更詳細的示例: https://github.com/tttapa/RPi-Cpp-Toolchain/tree/master/extra/python/cross-compile-module/spam


一個小建議:如果你寫了很多需要C/C++和Python交互的代碼,或者嵌入Python解釋器的代碼, Pybind11是一個很好的工具。 It has bindings for all standard C++ containers and Python/NumPy/Eigen types, it allows you to call Python code from C++ code, export C/C++ functions/structs/classes as Python modules, and it handles all compilation for you using CMake: https://github.com/pybind/cmake_example


編輯:如果您的秘密 CCODE 需要嵌入 Python,您必須鏈接到 libpython:

https://docs.python.org/3.8/whatsnew/3.8.html#debug-build-uses-the-same-abi-as-release-build

要將 Python 嵌入到應用程序中,必須將新的--embed選項傳遞給python3-config --libs --embed以獲取-lpython3.8 (將應用程序鏈接到 libpython)。

OPTS=$(${PY_CONFIG} --cflags --ldflags --embed)

暫無
暫無

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

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