> ## Content Index
> Fetch the complete content index at: https://www.rozhkov.me/llms.txt
> Use this file to discover other available public pages before exploring further.

# Проста оптимізація використання пам'яті з jemalloc
- URL: https://www.rozhkov.me/zero-cost-memory-consumption-improvement-with-jemalloc/
- Published: 2022-10-10T06:15:00.000Z
- Updated: 2022-10-10T06:15:00.000Z
- Author: Vova Rozhkov
- Tags: donate1024, робота

Один з найпростіших способів оптимізувати використання пам'яті програмою є використання [jemalloc](http://jemalloc.net/)—альтернативної імплементації `malloc`.

`malloc`—це стандартна функція виділення пам'яті в С. Вона використовується всередині [MRI](https://en.wikipedia.org/wiki/Ruby%5FMRI) та інтерпретаторів інших мов. Використання `jemalloc` прозоре—підміняється імплементація функції і програми працюють як і раніше, не підозрюючи що пам'ять тепер використовується більш ефективно. Поверхневі деталі імплементації ви можете почитати на [StackOverflow](https://stackoverflow.com/a/1624744/1434854), там ж є посилання на більш детальні пояснення.

Цей метод згадується практично у всіх гайдах по оптимізації Rails-додатків. Коли я тільки зробив [donate1024](https://donate1024.org/) то розмістив його на серверах з 256 мегабайтами пам'яті. З часом коли функцій та користувачів додалось, почав спрацьовувати [oom killer](https://www.kernel.org/doc/gorman/html/understand/understand016.html). Тоді я видав серверу ще 256 мегабайт і забув про проблему.

Нещодавно я займався перформерс оптимізаціями проекту і згадав про `jemalloc`. Навіщо платити більше? Тому я швиденько знайшов як додати його в Alpine Linux який в мене використовується як базовий образ, все зробив і задеплоїв:

```
FROM ruby:3.1.2-alpine AS jemalloc_builder

RUN apk add build-base
ARG JEMALLOC_VERSION=5.3.0
RUN wget -O - https://github.com/jemalloc/jemalloc/releases/download/${JEMALLOC_VERSION}/jemalloc-${JEMALLOC_VERSION}.tar.bz2 | tar -xj && \
    cd jemalloc-${JEMALLOC_VERSION} && \
    ./configure && \
    make && \
    make install

FROM ruby:3.1.2-alpine
COPY --from=jemalloc_builder /usr/local/lib/libjemalloc.so.2 /usr/local/lib/
ENV LD_PRELOAD=/usr/local/lib/libjemalloc.so.2
```

Для Alpine потрібно компілювати лібу, бо готовий пакет з якихось причин [перестали підтримувати](https://github.com/jemalloc/jemalloc/issues/1443).

В результаті використання пам'яті знизилось з \~230 мегабайт до \~180 чого вистачає для того щоб апка спокійно жила на інстансі з 256 мегабайтами. Таку ж оптимізацію я зробив для проекта [adopt.ua](https://www.adopt.ua/) де ефект був ще кращим: з \~270 мегабайт до \~170.

Для інших інтерпретаторів цей трюк по ідеї теж має працювати. Шукайте рішення для своєї платформи.