group-telegram.com/retired_on_fire/424
Last Update:
Вот за что я люблю Go, так это за то, что он чаще всего работает предсказуемо.
Если ты написал приложение, которое расходует нужное количество памяти, то можно быть уверенным что так будет в целом всегда и на любой операционной системе (если нет никаких завязок на что-то другое).
Плюс, компиляция в один статический бинарь в Go всё-таки удобнее сделана, потому что можно просто GOOS=linux GOARCH=amd64 go build
и оно собереться и можно дальше или в distroless или в scratch контейнер прокидывать и всё будет замечательно.
Я в целом фанат статической линковки, ведь в контейнере тогда только бинарь и всё. В Расте же пришлось чтобы добиться этого то думать как это вообще можно собрать в статический бинарь.
В целом, всё решалось просто тем, что мы берем gcc-musl
компилятор, который в отвязке от glibc
может всё собрать вместе с флагами '-C target-feature=+crt-static’
.
Однако OpenSSL библиотека скажет “давно пальцы веером, заюш” и откажется компилиться. Хоть в Расте и есть замена rustls
но не все либы ее поддерживают и не везде есть нужные фича флаги, так что выкорчевать ее не получилось. Но можно ее втащить в Cargo с vendored
фича флагом.
Вроде всё собралось и работало даже отлично какое-то время, но я думал, что musl может стрельнуть откуда-нибудь. Почитал какие есть минусы и все говорят, что в целом оно хоть и шустрое, но аллокация памяти у него хреновая. Ну я забил.
Однако, простое приложение, которое должно отжирать до 512 мегабайт оперативы решило жрать до 32 гигов и пришлось втаскивать jemalloc
или mimalloc
или еще что-нибудь другое более предсказуемое.
В итоге то, что должно было собраться без проблем решило еще повыпендриваться и не собираться, добавляя -m64
флаги для CC
В итоге после долгих попыток собрать всё это дело пришел к таким энвам, чтобы всё завелось
ENV CC=musl-gcc
ENV OPENSSL_NO_VENDOR=0 \
OPENSSL_STATIC=1 \
OPENSSL_DIR=/usr/local \
OPENSSL_LIB_DIR=/usr/local/lib \
OPENSSL_INCLUDE_DIR=/usr/local/include \
CARGO_NET_GIT_FETCH_WITH_CLI=true
ENV CFLAGS="-O2 -fPIC"
ENV SQLX_OFFLINE=true
ENV OPENSSL_BUILD_CPU=generic
ENV RUSTFLAGS='-C target-feature=+crt-static -C link-args='
А после переезда на jemalloc память стала использоваться нормально.
BY Андрей Журавлёв
Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260
Share with your friend now:
group-telegram.com/retired_on_fire/424