Re: Server che non rilascia la ram
On 11/03/2018 10:23, Michele Orsenigo wrote:
Macchina dopo il riavvio 15gg fa:
Fri Feb 23 07:10:01 CET 2018
total used free shared buff/cache available
Mem: 1527216 182940 1185340 15504 158936 1191596
Swap: 975868 0 975868
Ora:
total used free shared buff/cache available
Mem: 1527216 1209240 157888 25068 160088 152632
Swap: 975868 0 975868
Mi aspetto che entro un paio di giorni cominci ad andare sullo swap
(ho swappiness a 0) e quindi rallentare fino a diventare inutilizzabile,
come è successo le altre volte
questa è una cosa che ho visto anch'io sui desktop e che ho segnalato
sia qui in lista che come bug. La segnalazione è stata molto generica e
non è stata considerata, anche perché quando avevo segnalato il problema
la situazione era davvero drammatica, poi con le versioni successive il
problema è diventato più difficile da riprodurre con un uso normale del PC.
Ho cercato di indagare ulteriormente, ma senza molto successo. Ho notato
che facendo determinate cose la situazione precipita e puoi arrivare
all'intervento di Linux che fa kill di X perché non c'è più memoria
disponibile, questo nel giro di poche ore (ad esempio se usi
l'estensione di gnome che ti cambia lo sfondo con un'immagine a caso
prelevata da una directory ogni pochi minuti... almeno era così, perché
quell'estensione poi l'ho disabilitata) o puoi simularlo facendo
avvenire il crash in pochi secondi con un piccolo programma C++ (alloca
la maggior parte di ram e poi chiede all'utente di far partire una
registrazione video del desktop di gnome... però questo potrebbe essere
un altro problema, cioè un bug della registrazione desktop di gnome).
Il problema secondo me è di gnome e in specifico gnome-shell. Ho letto
che hanno fatto recentemente un rifacimento della gestione della memoria
(è da quella versione che ho iniziato a verificare questo problema).
Avevo fatto delle prove su una macchina con installato XFCE e senza
gnome e li non mi sembrava ci fosse questo problema (però questa
macchina ha architettura i386, mentre quelle su cui ho riscontrato il
problema hanno architettura amd64).
Una sensazione mia è che il problema sia la gestione della memoria non
più usata, ho la sensazione che quando un'applicazione non ha più
bisogno di memoria allocata la rilascia, ma in realtà non viene
rilasciata subito, ma resta ancora occupata per un tot di tempo (che può
diventare molto lungo) e questo causa la saturazione di memoria.
Sul server hai installato anche gnome?
Provo ad allegare il sorgente del file C++, se qualcuno vuole testare...
deve avere gnome e non deve avere nessun dato non salvato perché a me
causa l'uccisione di X e quindi di tutti i programmi grafici in
esecuzione. Potrebbe essere che a seconda di quanta RAM si ha a
disposizione occorra cambiare la percentuale di allocazione (ora alloca
i 9/10 di RAM e io ho 4GB). Una volta avviato bisogna far partire la
registrazione del desktop ti gnome come indicato dal messaggio che appare.
Non ho ancora riportato questo programma nel bug report perché nessuno
ha risposto e quindi sembra che nessun altro abbia riscontrato questa
problematica.
Ciao
Davide
--
Dizionari: http://linguistico.sourceforge.net/wiki
Perché microsoft continua a compiere azioni illegali?:
http://linguistico.sf.net/wiki/doku.php?id=traduzioni:ms_illegal
GNU/Linux User: 302090: http://counter.li.org
Non autorizzo la memorizzazione del mio indirizzo su outlook
#include <iostream>
#include <new>
#include <stdio.h>
#include <string.h>
#define DEFAULT_MEMORY_TARGET 0
using namespace std;
static unsigned long int
get_memory_target (void)
{
FILE *f;
/* Really simple "get amount of memory on the machine" if it
* doesn't work, you just get the default memory target.
*/
f = fopen("/proc/meminfo", "r");
if (!f)
return DEFAULT_MEMORY_TARGET;
while (!feof(f))
{
char line_buffer[1024];
unsigned long int mem_total;
if (fscanf(f, "MemAvailable: %u", &mem_total) == 1)
{
fclose(f);
return( mem_total * 1024 * 9 / 10);
}
/* Skip to the next line and discard what we read */
if (fgets(line_buffer, sizeof(line_buffer), f) == NULL)
break;
}
fclose(f);
return DEFAULT_MEMORY_TARGET;
}
int main( void )
{
unsigned long int TotMem = 0;
char *Buffer;
TotMem = get_memory_target();
if( TotMem == 0 )
{
cout << "Error reading memory";
return 1;
}
Buffer = new (std::nothrow) char[TotMem];
if( Buffer == NULL )
{
cout << "Error allocation " << TotMem << " memory";
return 1;
}
memset( Buffer, '-', TotMem-1 );
cout << "Nearly all the free RAM has been allocated (" << TotMem << " bytes). Press Ctrl-Alf-Shift-r to see the error and have a X crash... ATTENTION: you will lose all your not saved work!";
cout << "Elsewhere... press Enter key to stop and free the RAM";
string str;
getline( cin, str );
delete[] Buffer;
}
Reply to: