CentOS 7 nie może przydzielić pamięci podczas operacji „yum install”

11

Spróbuj yum install php56w-mcrypti system dał mi ten błąd

libmcrypt-2.5.8-13.el7.x86_64: [Errno 5] [Errno 12] Cannot allocate memory
php56w-mcrypt-5.6.5-1.w7.x86_64: [Errno 5] [Errno 12] Cannot allocate memory

Sprawdziłem free -m

             total       used       free     shared    buffers     cached
Mem:           490        421         68          8          3         42
-/+ buffers/cache:        376        113
Swap:            0          0          0

top

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 9756 mysql     20   0  727588  81556      0 S  0.3 16.2   1:04.61 mysqld
11089 root      20   0       0      0      0 S  0.3  0.0   0:16.25 kworker/0:2
    1 root      20   0  129396   2020    576 S  0.0  0.4   0:05.88 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   0:00.16 ksoftirqd/0
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
    8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/0
   10 root      20   0       0      0      0 S  0.0  0.0   0:01.82 rcu_sched
   11 root      20   0       0      0      0 R  0.0  0.0   0:02.10 rcuos/0
   12 root      rt   0       0      0      0 S  0.0  0.0   0:00.91 watchdog/0
   13 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 khelper
   14 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs
   15 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns
   16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback
   17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd

Nie wiem, gdzie jeszcze to sprawdzić.

Używam DigitalOceanVPS z RAM 512 MB, abonament 5 USD / miesiąc.

Muhaimin
źródło

Odpowiedzi:

8

Ten problem polega na tym, że serwer wydaje się mieć tylko 490 MB pamięci RAM na komputerze, a masz 421 MB. Pozostaje tylko 68 MB wolnego; to nie jest dużo pamięci dla żadnego systemu do pracy.

Patrząc na wyniki z toppokazuje, że mysqldwinowajcą jest MySQL (aka :).

Najlepszą rzeczą, jaką możesz zrobić, jeśli jest to sytuacja tymczasowa, jest po prostu zatrzymać MySQL w następujący sposób:

sudo service mysqld stop

Następnie przy zatrzymanym MySQL możesz działać yum installzgodnie z oczekiwaniami.

Ale innym rozwiązaniem byłoby użycie skryptu, takiego jak „MySQL Tuning Primer”, aby pomóc ocenić użycie i konfigurację MySQL na serwerze i odpowiednio dostosować. Powodem jest zwykły waniliowy MySQL po wyjęciu z pudełka będzie świnią pamięci. Ale „MySQL Tuning Primer” pomoże ocenić twoją instalację i poinformuje cię, co możesz poprawić. Obejmuje to zmniejszenie wymagań dotyczących pamięci, aby konfiguracja była zadowolona z ograniczonych zasobów. Jedynym haczykiem jest to, że MySQL musi aktywnie działać przez co najmniej 48 godzin, aby wyniki „MySQL Tuning Primer” były cokolwiek warte. W przeszłości dostrajanie wydajności MySQL za pomocą tego skryptu to świetny sposób na dostrojenie konfiguracji LAMP.

Ponadto, ponieważ używasz Apache, prawdopodobnie możesz obniżyć wymagania pamięci RAM dla Apache (aka httpd), aby zwolnić w ten sposób więcej pamięci RAM. Jest to dość ogólny zestaw poprawek do podstawowego środowiska programistycznego Apache, ale powinien ci pomóc. Najpierw otwórz konfigurację Apache za pomocą ulubionego edytora wiersza poleceń, takiego jak ten; Wolę, nanoale każdy edytor tekstu jest dobry:

sudo nano /etc/httpd/conf/httpd.conf 

Teraz znajdź wiersz, który mówi Timeouta , i zmień go na „120”; dwie minuty to rozsądny limit czasu:

Timeout 120

Podobnie znajdź MaxKeepAliveRequestsi zmień to na „24”; Połączenia „utrzymuj przy życiu” są dobre, ale nie pozwól im przytłoczyć konfiguracji:

MaxKeepAliveRequests 24

I znajdź KeepAliveTimeouti ustaw na „2”; powinno to korelować z szybkością ładowania jednej strony w witrynie i 2 sekund, co stanowi dobrą średnią:

KeepAliveTimeout 2

Teraz poszukaj dyrektywy konfiguracyjnej XML ustawionej jako <IfModule mpm_prefork_module>:

<IfModule mpm_prefork_module>
  StartServers           8
  MinSpareServers       16
  MaxSpareServers       32
  ServerLimit           40
  MaxClients            40
  MaxRequestsPerChild 2000
</IfModule>

Kluczem do tego jest ServerLimiti MaxClients. Domyślnie ustawienia Apache są dość wysokie; 255, MaxClientsbo wierzę. Ale w rzeczywistości nawet strona o dużym natężeniu ruchu uzyskuje tylko 70-80 połączeń na sekundę… A potem umiera… To znaczy, że połączenia Apache są bezstanowe, więc punktem odniesienia są połączenia na sekundę. Zatem w przypadku serwera programistycznego lub małego serwera „40” to dobra liczba.

Teraz po dokonaniu tych kluczowych zmian uruchom ponownie Apache w następujący sposób:

sudo service httpd restart

Dostosowując MySQL i Apache do bardziej rozsądnych ustawień niż wartości domyślne / standardowe, można zwolnić zasoby na serwerze i sprawić, że wszystko będzie działać płynniej.

JakeGould
źródło
17

Możesz utworzyć plik wymiany:

fallocate -l 512M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

Spowoduje to utworzenie pliku wymiany i będzie można instalować aplikacje. Aby usunąć plik wymiany:

swapoff -a
rm -f /swapfile

szczegóły w Arch Arch .

pbogut
źródło
1
Dobry pomysł. Czy jest jakiś powód, oprócz utraty miejsca na dysku, aby wyłączyć swap?
raider33
Zależy od ustawień zamiany, system może zacząć używać go przy około 50% obciążenia pamięci. Jeśli twój system ma, powiedzmy, 512 MB, ale przez większość czasu używa ~ 400 MB, będzie działał idealnie bez zamiany, ale dzięki temu może spowolnić próbę zamiany 150 MB tam iz powrotem. Ale mogę się mylić w tej sprawie.
pbogut
Nie zapomnij użyć sudopoleceń
Raptor
1
fallocate może oszukiwać i nie działać ... używaćsudo dd if=/dev/zero of=/swapfile count=512 bs=1MiB
Ray Foss