Docker na Heroku przekroczony przydział pamięci

Docker na Heroku przekroczony przydział pamięci
SS
  • Rejestracja:około 4 lata
  • Ostatnio:6 miesięcy
  • Postów:21
0

Witam, jestem załamany. Próbuję już bezskutecznie od kilku dni zoptymalizować zużywaną pamięć przez mój kontener, ale na Heroku wciąż przy starcie mojej apki w Spring Boocie pojawia się błąd:

Kopiuj
2021-11-16T14:39:43.245807+00:00 heroku[web.1]: source=web.1 dyno=heroku.152364067.4ead0741-02de-4b30-8781-628c655e5e0d sample#memory_total=840.98MB sample#memory_rss=492.79MB sample#memory_cache=0.03MB sample#memory_swap=348.16MB sample#memory_pgpgin=814490pages sample#memory_pgpgout=863090pages sample#memory_quota=512.00MB
2021-11-16T14:39:43.292468+00:00 heroku[web.1]: Process running mem=840M(164.2%)
2021-11-16T14:39:43.294393+00:00 heroku[web.1]: Error R14 (Memory quota exceeded)
2021-11-16T14:40:05.323421+00:00 heroku[web.1]: Process exited with status 137

Jak więc widać przydział pamięci został przekroczony o 64.2%.

Nie mam pojęcia co mam poprawić, żeby apka na tym kontenerze poprawnie śmigała na Heroku. Oto mój Dockerfile, który działa:

Kopiuj
FROM node:14.16.1-alpine3.13

RUN apk update && \
    apk add --no-cache bash && \
    apk add --no-cache openjdk8 && \
    apk add --no-cache java-cacerts && \
    update-ca-certificates -f && \
    apk add --no-cache sudo && \
    echo "root:kuba" | chpasswd

USER root

RUN echo "kuba" | sudo -S apk add --no-cache curl && \ 
    mkdir -p /usr/local/lib && \
    cd /usr/local/lib && \
    curl https://cli-assets.heroku.com/heroku-linux-x64.tar.gz | tar xz && \
    rm heroku/bin/node && \
    ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku && \
    heroku version

# Setup JAVA_HOME -- useful for docker commandline
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

# Add an app and listen on port
COPY target/project-server-1.0-SNAPSHOT.jar /
COPY project-91878452-firebase-adminsdk-dxv9z-0db48a2d01.json /
    
EXPOSE 8000
CMD java -jar project-server-1.0-SNAPSHOT.jar

Nie wiem co jeszcze Wam może być przydatne do inwestygacji tej kwestii. Help! ;(

LU
  • Rejestracja:około 15 lat
  • Ostatnio:5 miesięcy
1

To nie wina ani heroku ani dockera. Może masz gdzieś memory leak? Możesz się podzielić kodem apki?

PS. czemu używasz obrazu node:14.16.1 i czemu alpine?

edytowany 1x, ostatnio: Lucassith
SS
Jaki konkretnie fragment apki byś chciał, przecież całego projektu tu nie wrzucę. A takiego obrazu używam bo nie znajdywało mi node.js przy instalacji Heroku CLI, a bez tego mi wywalało błąd. Wersja alpine bo to ponoć mało waży na czym mi bardzo zależy
LU
Nikt Ci nie pomoże bez kodu. To tak jakby zepsuł Ci się samochód, zadzwoniłbyś do mechanika, mechanik kazałby Ci przyjechać a Ty do niego "jaki konkretnie fragment samochodu byś chciał, przecież całym do Ciebie nie przyjadę". Wrzuć na githuba i podlinkuj. Wrażliwe elementy jak hasła i tak powinieneś trzymać w plikach .env i wpisanych w .gitignore. Oprócz tego ten Dockerfile jest słabo zrobiony. Spróbuj na początek użyć bullseye-slim zamiast alpine. Alpine jest nieporęczny a Debian slim dużo lepiej współpracuje.
SS
Skoro już odnosimy się do przykładów z życia, to zaproponuję swój. To tak jakbyś poszedł do lekarza i powiedział mu, że coś Cie boli. Ten będzie potrafił podać możliwe przyczyny bez zagłębiania się w wsłuchanie się w organizm, wymaz krwi, mocz itd. Kodu nie wrzucę bo on tak naprawdę służy za 2 osobne projekty, za backend jednej z moich stron internetowych, a po drugie obsługuje opisywany tu projekt. Poza tym kod jest dość brzydki i zagmatwany. Skoro działa dockerfile i ktoś wspomniał, że to nie jego wina, to po co mam coś zmieniać i narażać się na niedziałanie?
LU
To ja zaproponuje jeszcze jeden przykład z życia wzięty, człowiek napisał na forum że heroku wywala aplikację bo zżera za dużo pamięci i nikt mu nie pomógł bo nie udostępnił kodu. PS Twój Dockerfile wygląda jak patyk ociosany tępym scyzorykiem. Skoro mówisz, że z kodem jest podobnie to pewnie masz gdzieś memory leak z głupiego powodu którego nikt nie znajdzie bo nie ma jak.
SS
Powiem tyle, że jak na początku wrzucałem samą apke w Spring Boocie bez kontenera to wszystko śmigało bez błędów, dopiero jak ją opakowałem w kontener Dokerowy to pojawił się ten błąd przekroczenia rozmiaru. Więc to chyba nie wina samego projektu.
LU
  • Rejestracja:około 15 lat
  • Ostatnio:5 miesięcy
1

Sprawdź ten Dockerfile

Kopiuj
FROM node:16.13.0-bullseye-slim

RUN echo "root:kuba" | chpasswd

RUN apt update --yes && \
    apt --yes install \
        build-essential \
        software-properties-common \
        curl \
        gnupg2 \
        ca-certificates \
        ca-certificates-java \
        sudo && \
    rm -rf /var/lib/apt/lists/*

RUN curl "https://adoptopenjdk.jfrog.io/adoptopenjdk/api/gpg/key/public" | apt-key add - && \
    add-apt-repository --yes https://adoptopenjdk.jfrog.io/adoptopenjdk/deb/

RUN apt update --yes && \
    apt install --yes \
        adoptopenjdk-8-hotspot && \
    rm -rf /var/lib/apt/lists/*

RUN update-alternatives --set java /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/bin/java 

RUN mkdir -p /usr/local/lib && \
    cd /usr/local/lib && \
    curl https://cli-assets.heroku.com/heroku-linux-x64.tar.gz | tar xz && \
    rm heroku/bin/node && \
    ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku

RUN heroku version
RUN java -version

ENV JAVA_HOME /usr/lib/jvm/adoptopenjdk-8-hotspot-amd64/

COPY target/project-server-1.0-SNAPSHOT.jar /
COPY project-91878452-firebase-adminsdk-dxv9z-0db48a2d01.json /

EXPOSE 8000
CMD java -jar project-server-1.0-SNAPSHOT.jar

Build apki powinieneś robić w środowisku dockera, tutaj widzę, że masz już jakiś target czyli coś już jest zbudowane.

edytowany 7x, ostatnio: Lucassith
SS
Dzięki, jutro przetestuję. "Build apki powinieneś robić w środowisku dockera", a nie wiem ja robiłem wedle tutoriala na YouTubie niejakiego Bykowskiego Przemysława
PanamaJoe
offtop: to może nie rób wg tutoriali polskich celebrytów
pvw
  • Rejestracja:ponad 17 lat
  • Ostatnio:17 dni
  • Lokalizacja:Kraków
0

moze lepiej uzyj obrazu

https://hub.docker.com/layers/azul/zulu-openjdk-alpine/11-jre/

  • pokombinuj z opcjami , zamiast cmd:

ENTRYPOINT ["java","-Dserver.port=$PORT","-Xmx268M","-Xss512K","-
XX:CICompilerCount=2","-Dfile.encoding=UTF-8","-
XX:+UseContainerSupport","-Djava.security.egd=file:/dev/./urandom","-
Xlog:gc","-jar","/app.jar"]

ale i tak kod musisz miec optymalny aby nie przekraczac pamieci.


https://rozwoj-oprogramowania.pl
If You think of MS-DOS as mono, and Windows or macOS as stereo, then Linux is Dolby Pro-Logic Surround Sound with Bass Boost and all the music is for free
Charles_Ray
  • Rejestracja:prawie 17 lat
  • Ostatnio:2 dni
  • Postów:1873
0

Wyglada jakbyś przekroczyl quota na darmowym Heroku: https://devcenter.heroku.com/articles/java-memory-issues#heroku-memory-limits W takim wypadku zaalokowanie wiekszego heapa nie pomoże. Sprobuj ustawic Xmx na mniejsza wartosc (400mb?).


”Engineering is easy. People are hard.” Bill Coughran
edytowany 1x, ostatnio: Charles_Ray
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)