Написал два Hello World вебприложения. Одно на Go - самое простое, другое на Rust - на Iron Framework. Оба возвращают одно и то же на любой HTTP запрос.
Запускаю оба сервера в docker.
Go жрет 4 МБ, Rust - 7 MB памяти. Rust по идее должен быть более экономным, но в данном случае в Go используется стандартный сервер, а в Rust - сторонний фреймворк. В любом случае разница - мелочь.
Запускаю все в Kubernetes, тоже в docker. Rust раздувает до 130 МБ (RSS), в Go ничего не поменялось. Думаю, ну наверное Go - статический бинарь без libc, а Rust - зависит на glibc. Ведь дейсвительно, Go запускается в образе Busybox, а Rust - в Ubuntu. Memory sharing показывает малый и там и там, и даже на локалке. Даже если запустить 3 процесса с Rust - все жрут 130 MB. Rust бинарь собирал в Gentoo, запускал на Ubuntu. Оно запороло какую-то оптимизацию?
И тут я сделал третий эксперимент. Я сделал такой-же сервер на Python. Он благополучно выжрал 13 MB в Kubernetes. D 10 раз меньше Rust
Я смотрю Rust готов к продакшну по полной программе. У меня руки не доходят его собрать с Musl, посмотреть.
Идеи, предложения? Ведь Rust таки жрал 7 MB на локальном докере в Gentoo. Почему так раздуло с Ubuntu libc на ядре CoreOS, причем только его одного?
Update: Пересобрал в статический бинарь с Musl и засунул в голый Busybox образ в котором даже каталогов /lib и /usr/lib нету. Локально стало меньше жрать, жрет 1.5MB. В Kubernetes - 130MB все равно.
Solved: Rust cоздавал 64 потока, потому что у него количество потоков - num_cpu * 8. На локальной тачке тоже, но непонятно почему локально не использовалось так много памяти
Solved2: man overcommit