Is this how linux paging should behave? (because it seems awful…)












21















When my linux system gets close to paging (i.e., in my case, 16GB ram almost full, 16GB swap completely empty) if a new process X tries to allocate some memory the system completely locks. That is, until a disproportionate amount of pages, (wrt the total size and rate of X's memory allocation requests) have been swapped out. Notice that not only the gui becomes completely unresponsive but even basic services like sshd are completely blocked.



These are two pieces of code (admittedly crude) that I use to trigger this behavior in a more "scientific" way.
The first one gets two numbers x,y from the command line and proceeds to
allocate and initialize multiple chunks of y bytes until more than x total bytes have been allocated. And then just sleeps undefinitely.
This will be used to bring the system on the brink of paging.



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv) {
long int max = -1;
int mb = 0;
long int size = 0;
long int total = 0;
char* buffer;

if(argc > 1)
{
max = atol(argv[1]);
size = atol(argv[2]);
}
printf("Max: %lu bytesn", max);
while((buffer=malloc(size)) != NULL && total < max) {
memset(buffer, 0, size);
mb++;
total=mb*size;
printf("Allocated %lu bytesn", total);
}
sleep(3000000);
return 0;
}


The second piece of code does exactly what the first does except that it has a sleep(1); right after the printf (I'm not going to repeat the whole code). This one will be used when the system is on brink of paging to get it to swap pages out in a "gentle" way i.e. by slowly requesting the allocation of new chunks of memory (so that the system should certainly be able to swap out pages and keep up with the new requests).



So, with the two pieces of code compiled, let's call the respective exes fasteater and sloweater, let's do this:



1) start your favorite gui (not strictly necessary of course)



2) start some mem/swap meter (e.g. watch -n 1 free)



3) start multiple instances of fasteater x y where x is of the order of gigabytes and y is of the order of megabytes. Do it until you almost fill the ram.



4) start one instance of sloweater x y, again where x is of the order of gigabytes and y is of the order of megabytes.



After step 4) what should happen (and it always happens for my system) is that just after having exhausted the ram, the system will lock completely.
gui is locked sshd is locked etc.
BUT, not forever! After sloweater has finished its allocation requests the system will come back to life (after minutes of locking, not seconds...)
with this situation:



a) ram is about full



b) swap is also about full (remember, it was empty at the beginning)



c) no oom killer intervention.



And notice that the swap partition is on an SSD. So, the system seems to be unable to gradually moving pages from ram to the swap (presumably from the fasteaters that are just sleeping) to make space for the slow (and of just few megabytes) requests of the sloweater.



Now, someone correct me if I'm wrong, but this does not seem the way a modern system should behave in this setting. It seems to behave like the old systems (waaaaay back) when there was no support for paging and the virtual memory system just swapped out the entire memory space of some process instead of few pages.



Can someone test this too? And maybe someone that also has a BSD system.



UPDATE 1
I followed the advice from Mark Plotnick below in the comments and I started vmstat 1 >out before proceeding with the paging test. You can see the result below (I cut the whole initial part where ram is filled without swap involvement):



procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 6144 160792 8 272868 0 0 0 0 281 1839 1 0 99 0 0
0 0 6144 177844 8 246096 0 0 0 0 425 2300 1 1 99 0 0
0 0 6144 168528 8 246112 0 0 16 0 293 1939 1 0 99 0 0
0 0 6144 158320 8 246116 0 0 0 0 261 1245 0 0 100 0 0
2 0 10752 161624 8 229024 0 4820 17148 4820 845 3656 1 2 97 0 0
2 0 10752 157300 8 228096 0 0 88348 0 2114 8902 0 5 94 1 0
0 0 10752 176108 8 200052 0 0 108312 0 2466 9772 1 5 91 3 0
0 0 10752 170040 8 196780 0 0 17380 0 507 1895 0 1 99 0 0
0 10 10752 160436 8 191244 0 0 346872 20 4184 17274 1 9 64 26 0
0 29 12033856 152888 8 116696 5992 15916880 1074132 15925816 819374 2473643 0 94 0 6 0
3 21 12031552 295644 8 136536 1188 0 11348 0 1362 3913 0 1 10 89 0
0 11 12030528 394072 8 151000 2016 0 17304 0 907 2867 0 1 13 86 0
0 11 12030016 485252 8 158528 708 0 7472 0 566 1680 0 1 23 77 0
0 11 12029248 605820 8 159608 900 0 2024 0 371 1289 0 0 31 69 0
0 11 12028992 725344 8 160472 1076 0 1204 0 387 1381 0 1 33 66 0
0 12 12028480 842276 8 162056 724 0 3112 0 357 1142 0 1 38 61 0
0 13 12027968 937828 8 162652 776 0 1312 0 363 1191 0 1 31 68 0
0 9 12027456 1085672 8 163260 656 0 1520 0 439 1497 0 0 30 69 0
0 10 12027200 1207624 8 163684 728 0 992 0 411 1268 0 0 42 58 0
0 9 12026688 1331492 8 164740 600 0 1732 0 392 1203 0 0 36 64 0
0 9 12026432 1458312 8 166020 628 0 1644 0 366 1176 0 0 33 66 0


As you can see, as soon as the swap gets involved there is a massive swapout of 15916880 Kbytes all at once which, I guess, lasts for the whole duration of the system freeze. And all of this is apparently caused by a process (the sloweater) that just asks for 10MB every second.



UPDATE 2: I did a quick installation of freebsd and repeated the same allocation scheme used with linux...and it was as smooth as it should be. freebsd swapped pages gradually while the sloweater allocated all its 10MB chunks of memory. Not one hitch of any kind...WTF is going on here?!



UPDATE 3: I filed a bug with the kernel bugtracker. It seems to be getting some attention so...fingers crossed...










share|improve this question




















  • 1





    Can you ssh into your system from another system and run vmstat 1 while this is happening?

    – Mark Plotnick
    May 3 '18 at 16:54






  • 2





    As I mentioned, everything is locked. I tried ssh'ing from another system it just times out.

    – John Terragon
    May 3 '18 at 16:59






  • 2





    If I start vmstat 1 with stdout output, I think it's going to freeze. But you're right, I could just start vmstat 1>somefile directly from the system and then see what it reports after the system has come back to life. I'll try that.

    – John Terragon
    May 4 '18 at 11:22






  • 2





    I used vmstat. Results in the update above.

    – John Terragon
    May 4 '18 at 13:05






  • 3





    swappiness is the default 60 (not that changing it gives a better result). The kernel used with the vmstat run is 4.14.35 but I've tried 4.15, 4.16 and I've even gone back to the 4.0 series (!): always the same behavior. And it's not that I'm using some weird distribution, it's just debian. I don't use the kernel images from debian (not that mine have unusual configs) but I've tried one of those...same behavior.

    – John Terragon
    May 4 '18 at 14:59
















21















When my linux system gets close to paging (i.e., in my case, 16GB ram almost full, 16GB swap completely empty) if a new process X tries to allocate some memory the system completely locks. That is, until a disproportionate amount of pages, (wrt the total size and rate of X's memory allocation requests) have been swapped out. Notice that not only the gui becomes completely unresponsive but even basic services like sshd are completely blocked.



These are two pieces of code (admittedly crude) that I use to trigger this behavior in a more "scientific" way.
The first one gets two numbers x,y from the command line and proceeds to
allocate and initialize multiple chunks of y bytes until more than x total bytes have been allocated. And then just sleeps undefinitely.
This will be used to bring the system on the brink of paging.



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv) {
long int max = -1;
int mb = 0;
long int size = 0;
long int total = 0;
char* buffer;

if(argc > 1)
{
max = atol(argv[1]);
size = atol(argv[2]);
}
printf("Max: %lu bytesn", max);
while((buffer=malloc(size)) != NULL && total < max) {
memset(buffer, 0, size);
mb++;
total=mb*size;
printf("Allocated %lu bytesn", total);
}
sleep(3000000);
return 0;
}


The second piece of code does exactly what the first does except that it has a sleep(1); right after the printf (I'm not going to repeat the whole code). This one will be used when the system is on brink of paging to get it to swap pages out in a "gentle" way i.e. by slowly requesting the allocation of new chunks of memory (so that the system should certainly be able to swap out pages and keep up with the new requests).



So, with the two pieces of code compiled, let's call the respective exes fasteater and sloweater, let's do this:



1) start your favorite gui (not strictly necessary of course)



2) start some mem/swap meter (e.g. watch -n 1 free)



3) start multiple instances of fasteater x y where x is of the order of gigabytes and y is of the order of megabytes. Do it until you almost fill the ram.



4) start one instance of sloweater x y, again where x is of the order of gigabytes and y is of the order of megabytes.



After step 4) what should happen (and it always happens for my system) is that just after having exhausted the ram, the system will lock completely.
gui is locked sshd is locked etc.
BUT, not forever! After sloweater has finished its allocation requests the system will come back to life (after minutes of locking, not seconds...)
with this situation:



a) ram is about full



b) swap is also about full (remember, it was empty at the beginning)



c) no oom killer intervention.



And notice that the swap partition is on an SSD. So, the system seems to be unable to gradually moving pages from ram to the swap (presumably from the fasteaters that are just sleeping) to make space for the slow (and of just few megabytes) requests of the sloweater.



Now, someone correct me if I'm wrong, but this does not seem the way a modern system should behave in this setting. It seems to behave like the old systems (waaaaay back) when there was no support for paging and the virtual memory system just swapped out the entire memory space of some process instead of few pages.



Can someone test this too? And maybe someone that also has a BSD system.



UPDATE 1
I followed the advice from Mark Plotnick below in the comments and I started vmstat 1 >out before proceeding with the paging test. You can see the result below (I cut the whole initial part where ram is filled without swap involvement):



procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 6144 160792 8 272868 0 0 0 0 281 1839 1 0 99 0 0
0 0 6144 177844 8 246096 0 0 0 0 425 2300 1 1 99 0 0
0 0 6144 168528 8 246112 0 0 16 0 293 1939 1 0 99 0 0
0 0 6144 158320 8 246116 0 0 0 0 261 1245 0 0 100 0 0
2 0 10752 161624 8 229024 0 4820 17148 4820 845 3656 1 2 97 0 0
2 0 10752 157300 8 228096 0 0 88348 0 2114 8902 0 5 94 1 0
0 0 10752 176108 8 200052 0 0 108312 0 2466 9772 1 5 91 3 0
0 0 10752 170040 8 196780 0 0 17380 0 507 1895 0 1 99 0 0
0 10 10752 160436 8 191244 0 0 346872 20 4184 17274 1 9 64 26 0
0 29 12033856 152888 8 116696 5992 15916880 1074132 15925816 819374 2473643 0 94 0 6 0
3 21 12031552 295644 8 136536 1188 0 11348 0 1362 3913 0 1 10 89 0
0 11 12030528 394072 8 151000 2016 0 17304 0 907 2867 0 1 13 86 0
0 11 12030016 485252 8 158528 708 0 7472 0 566 1680 0 1 23 77 0
0 11 12029248 605820 8 159608 900 0 2024 0 371 1289 0 0 31 69 0
0 11 12028992 725344 8 160472 1076 0 1204 0 387 1381 0 1 33 66 0
0 12 12028480 842276 8 162056 724 0 3112 0 357 1142 0 1 38 61 0
0 13 12027968 937828 8 162652 776 0 1312 0 363 1191 0 1 31 68 0
0 9 12027456 1085672 8 163260 656 0 1520 0 439 1497 0 0 30 69 0
0 10 12027200 1207624 8 163684 728 0 992 0 411 1268 0 0 42 58 0
0 9 12026688 1331492 8 164740 600 0 1732 0 392 1203 0 0 36 64 0
0 9 12026432 1458312 8 166020 628 0 1644 0 366 1176 0 0 33 66 0


As you can see, as soon as the swap gets involved there is a massive swapout of 15916880 Kbytes all at once which, I guess, lasts for the whole duration of the system freeze. And all of this is apparently caused by a process (the sloweater) that just asks for 10MB every second.



UPDATE 2: I did a quick installation of freebsd and repeated the same allocation scheme used with linux...and it was as smooth as it should be. freebsd swapped pages gradually while the sloweater allocated all its 10MB chunks of memory. Not one hitch of any kind...WTF is going on here?!



UPDATE 3: I filed a bug with the kernel bugtracker. It seems to be getting some attention so...fingers crossed...










share|improve this question




















  • 1





    Can you ssh into your system from another system and run vmstat 1 while this is happening?

    – Mark Plotnick
    May 3 '18 at 16:54






  • 2





    As I mentioned, everything is locked. I tried ssh'ing from another system it just times out.

    – John Terragon
    May 3 '18 at 16:59






  • 2





    If I start vmstat 1 with stdout output, I think it's going to freeze. But you're right, I could just start vmstat 1>somefile directly from the system and then see what it reports after the system has come back to life. I'll try that.

    – John Terragon
    May 4 '18 at 11:22






  • 2





    I used vmstat. Results in the update above.

    – John Terragon
    May 4 '18 at 13:05






  • 3





    swappiness is the default 60 (not that changing it gives a better result). The kernel used with the vmstat run is 4.14.35 but I've tried 4.15, 4.16 and I've even gone back to the 4.0 series (!): always the same behavior. And it's not that I'm using some weird distribution, it's just debian. I don't use the kernel images from debian (not that mine have unusual configs) but I've tried one of those...same behavior.

    – John Terragon
    May 4 '18 at 14:59














21












21








21


9






When my linux system gets close to paging (i.e., in my case, 16GB ram almost full, 16GB swap completely empty) if a new process X tries to allocate some memory the system completely locks. That is, until a disproportionate amount of pages, (wrt the total size and rate of X's memory allocation requests) have been swapped out. Notice that not only the gui becomes completely unresponsive but even basic services like sshd are completely blocked.



These are two pieces of code (admittedly crude) that I use to trigger this behavior in a more "scientific" way.
The first one gets two numbers x,y from the command line and proceeds to
allocate and initialize multiple chunks of y bytes until more than x total bytes have been allocated. And then just sleeps undefinitely.
This will be used to bring the system on the brink of paging.



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv) {
long int max = -1;
int mb = 0;
long int size = 0;
long int total = 0;
char* buffer;

if(argc > 1)
{
max = atol(argv[1]);
size = atol(argv[2]);
}
printf("Max: %lu bytesn", max);
while((buffer=malloc(size)) != NULL && total < max) {
memset(buffer, 0, size);
mb++;
total=mb*size;
printf("Allocated %lu bytesn", total);
}
sleep(3000000);
return 0;
}


The second piece of code does exactly what the first does except that it has a sleep(1); right after the printf (I'm not going to repeat the whole code). This one will be used when the system is on brink of paging to get it to swap pages out in a "gentle" way i.e. by slowly requesting the allocation of new chunks of memory (so that the system should certainly be able to swap out pages and keep up with the new requests).



So, with the two pieces of code compiled, let's call the respective exes fasteater and sloweater, let's do this:



1) start your favorite gui (not strictly necessary of course)



2) start some mem/swap meter (e.g. watch -n 1 free)



3) start multiple instances of fasteater x y where x is of the order of gigabytes and y is of the order of megabytes. Do it until you almost fill the ram.



4) start one instance of sloweater x y, again where x is of the order of gigabytes and y is of the order of megabytes.



After step 4) what should happen (and it always happens for my system) is that just after having exhausted the ram, the system will lock completely.
gui is locked sshd is locked etc.
BUT, not forever! After sloweater has finished its allocation requests the system will come back to life (after minutes of locking, not seconds...)
with this situation:



a) ram is about full



b) swap is also about full (remember, it was empty at the beginning)



c) no oom killer intervention.



And notice that the swap partition is on an SSD. So, the system seems to be unable to gradually moving pages from ram to the swap (presumably from the fasteaters that are just sleeping) to make space for the slow (and of just few megabytes) requests of the sloweater.



Now, someone correct me if I'm wrong, but this does not seem the way a modern system should behave in this setting. It seems to behave like the old systems (waaaaay back) when there was no support for paging and the virtual memory system just swapped out the entire memory space of some process instead of few pages.



Can someone test this too? And maybe someone that also has a BSD system.



UPDATE 1
I followed the advice from Mark Plotnick below in the comments and I started vmstat 1 >out before proceeding with the paging test. You can see the result below (I cut the whole initial part where ram is filled without swap involvement):



procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 6144 160792 8 272868 0 0 0 0 281 1839 1 0 99 0 0
0 0 6144 177844 8 246096 0 0 0 0 425 2300 1 1 99 0 0
0 0 6144 168528 8 246112 0 0 16 0 293 1939 1 0 99 0 0
0 0 6144 158320 8 246116 0 0 0 0 261 1245 0 0 100 0 0
2 0 10752 161624 8 229024 0 4820 17148 4820 845 3656 1 2 97 0 0
2 0 10752 157300 8 228096 0 0 88348 0 2114 8902 0 5 94 1 0
0 0 10752 176108 8 200052 0 0 108312 0 2466 9772 1 5 91 3 0
0 0 10752 170040 8 196780 0 0 17380 0 507 1895 0 1 99 0 0
0 10 10752 160436 8 191244 0 0 346872 20 4184 17274 1 9 64 26 0
0 29 12033856 152888 8 116696 5992 15916880 1074132 15925816 819374 2473643 0 94 0 6 0
3 21 12031552 295644 8 136536 1188 0 11348 0 1362 3913 0 1 10 89 0
0 11 12030528 394072 8 151000 2016 0 17304 0 907 2867 0 1 13 86 0
0 11 12030016 485252 8 158528 708 0 7472 0 566 1680 0 1 23 77 0
0 11 12029248 605820 8 159608 900 0 2024 0 371 1289 0 0 31 69 0
0 11 12028992 725344 8 160472 1076 0 1204 0 387 1381 0 1 33 66 0
0 12 12028480 842276 8 162056 724 0 3112 0 357 1142 0 1 38 61 0
0 13 12027968 937828 8 162652 776 0 1312 0 363 1191 0 1 31 68 0
0 9 12027456 1085672 8 163260 656 0 1520 0 439 1497 0 0 30 69 0
0 10 12027200 1207624 8 163684 728 0 992 0 411 1268 0 0 42 58 0
0 9 12026688 1331492 8 164740 600 0 1732 0 392 1203 0 0 36 64 0
0 9 12026432 1458312 8 166020 628 0 1644 0 366 1176 0 0 33 66 0


As you can see, as soon as the swap gets involved there is a massive swapout of 15916880 Kbytes all at once which, I guess, lasts for the whole duration of the system freeze. And all of this is apparently caused by a process (the sloweater) that just asks for 10MB every second.



UPDATE 2: I did a quick installation of freebsd and repeated the same allocation scheme used with linux...and it was as smooth as it should be. freebsd swapped pages gradually while the sloweater allocated all its 10MB chunks of memory. Not one hitch of any kind...WTF is going on here?!



UPDATE 3: I filed a bug with the kernel bugtracker. It seems to be getting some attention so...fingers crossed...










share|improve this question
















When my linux system gets close to paging (i.e., in my case, 16GB ram almost full, 16GB swap completely empty) if a new process X tries to allocate some memory the system completely locks. That is, until a disproportionate amount of pages, (wrt the total size and rate of X's memory allocation requests) have been swapped out. Notice that not only the gui becomes completely unresponsive but even basic services like sshd are completely blocked.



These are two pieces of code (admittedly crude) that I use to trigger this behavior in a more "scientific" way.
The first one gets two numbers x,y from the command line and proceeds to
allocate and initialize multiple chunks of y bytes until more than x total bytes have been allocated. And then just sleeps undefinitely.
This will be used to bring the system on the brink of paging.



#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char** argv) {
long int max = -1;
int mb = 0;
long int size = 0;
long int total = 0;
char* buffer;

if(argc > 1)
{
max = atol(argv[1]);
size = atol(argv[2]);
}
printf("Max: %lu bytesn", max);
while((buffer=malloc(size)) != NULL && total < max) {
memset(buffer, 0, size);
mb++;
total=mb*size;
printf("Allocated %lu bytesn", total);
}
sleep(3000000);
return 0;
}


The second piece of code does exactly what the first does except that it has a sleep(1); right after the printf (I'm not going to repeat the whole code). This one will be used when the system is on brink of paging to get it to swap pages out in a "gentle" way i.e. by slowly requesting the allocation of new chunks of memory (so that the system should certainly be able to swap out pages and keep up with the new requests).



So, with the two pieces of code compiled, let's call the respective exes fasteater and sloweater, let's do this:



1) start your favorite gui (not strictly necessary of course)



2) start some mem/swap meter (e.g. watch -n 1 free)



3) start multiple instances of fasteater x y where x is of the order of gigabytes and y is of the order of megabytes. Do it until you almost fill the ram.



4) start one instance of sloweater x y, again where x is of the order of gigabytes and y is of the order of megabytes.



After step 4) what should happen (and it always happens for my system) is that just after having exhausted the ram, the system will lock completely.
gui is locked sshd is locked etc.
BUT, not forever! After sloweater has finished its allocation requests the system will come back to life (after minutes of locking, not seconds...)
with this situation:



a) ram is about full



b) swap is also about full (remember, it was empty at the beginning)



c) no oom killer intervention.



And notice that the swap partition is on an SSD. So, the system seems to be unable to gradually moving pages from ram to the swap (presumably from the fasteaters that are just sleeping) to make space for the slow (and of just few megabytes) requests of the sloweater.



Now, someone correct me if I'm wrong, but this does not seem the way a modern system should behave in this setting. It seems to behave like the old systems (waaaaay back) when there was no support for paging and the virtual memory system just swapped out the entire memory space of some process instead of few pages.



Can someone test this too? And maybe someone that also has a BSD system.



UPDATE 1
I followed the advice from Mark Plotnick below in the comments and I started vmstat 1 >out before proceeding with the paging test. You can see the result below (I cut the whole initial part where ram is filled without swap involvement):



procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 6144 160792 8 272868 0 0 0 0 281 1839 1 0 99 0 0
0 0 6144 177844 8 246096 0 0 0 0 425 2300 1 1 99 0 0
0 0 6144 168528 8 246112 0 0 16 0 293 1939 1 0 99 0 0
0 0 6144 158320 8 246116 0 0 0 0 261 1245 0 0 100 0 0
2 0 10752 161624 8 229024 0 4820 17148 4820 845 3656 1 2 97 0 0
2 0 10752 157300 8 228096 0 0 88348 0 2114 8902 0 5 94 1 0
0 0 10752 176108 8 200052 0 0 108312 0 2466 9772 1 5 91 3 0
0 0 10752 170040 8 196780 0 0 17380 0 507 1895 0 1 99 0 0
0 10 10752 160436 8 191244 0 0 346872 20 4184 17274 1 9 64 26 0
0 29 12033856 152888 8 116696 5992 15916880 1074132 15925816 819374 2473643 0 94 0 6 0
3 21 12031552 295644 8 136536 1188 0 11348 0 1362 3913 0 1 10 89 0
0 11 12030528 394072 8 151000 2016 0 17304 0 907 2867 0 1 13 86 0
0 11 12030016 485252 8 158528 708 0 7472 0 566 1680 0 1 23 77 0
0 11 12029248 605820 8 159608 900 0 2024 0 371 1289 0 0 31 69 0
0 11 12028992 725344 8 160472 1076 0 1204 0 387 1381 0 1 33 66 0
0 12 12028480 842276 8 162056 724 0 3112 0 357 1142 0 1 38 61 0
0 13 12027968 937828 8 162652 776 0 1312 0 363 1191 0 1 31 68 0
0 9 12027456 1085672 8 163260 656 0 1520 0 439 1497 0 0 30 69 0
0 10 12027200 1207624 8 163684 728 0 992 0 411 1268 0 0 42 58 0
0 9 12026688 1331492 8 164740 600 0 1732 0 392 1203 0 0 36 64 0
0 9 12026432 1458312 8 166020 628 0 1644 0 366 1176 0 0 33 66 0


As you can see, as soon as the swap gets involved there is a massive swapout of 15916880 Kbytes all at once which, I guess, lasts for the whole duration of the system freeze. And all of this is apparently caused by a process (the sloweater) that just asks for 10MB every second.



UPDATE 2: I did a quick installation of freebsd and repeated the same allocation scheme used with linux...and it was as smooth as it should be. freebsd swapped pages gradually while the sloweater allocated all its 10MB chunks of memory. Not one hitch of any kind...WTF is going on here?!



UPDATE 3: I filed a bug with the kernel bugtracker. It seems to be getting some attention so...fingers crossed...







kernel swap virtual-memory






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jun 25 '18 at 19:00







John Terragon

















asked May 3 '18 at 16:08









John TerragonJohn Terragon

1564




1564








  • 1





    Can you ssh into your system from another system and run vmstat 1 while this is happening?

    – Mark Plotnick
    May 3 '18 at 16:54






  • 2





    As I mentioned, everything is locked. I tried ssh'ing from another system it just times out.

    – John Terragon
    May 3 '18 at 16:59






  • 2





    If I start vmstat 1 with stdout output, I think it's going to freeze. But you're right, I could just start vmstat 1>somefile directly from the system and then see what it reports after the system has come back to life. I'll try that.

    – John Terragon
    May 4 '18 at 11:22






  • 2





    I used vmstat. Results in the update above.

    – John Terragon
    May 4 '18 at 13:05






  • 3





    swappiness is the default 60 (not that changing it gives a better result). The kernel used with the vmstat run is 4.14.35 but I've tried 4.15, 4.16 and I've even gone back to the 4.0 series (!): always the same behavior. And it's not that I'm using some weird distribution, it's just debian. I don't use the kernel images from debian (not that mine have unusual configs) but I've tried one of those...same behavior.

    – John Terragon
    May 4 '18 at 14:59














  • 1





    Can you ssh into your system from another system and run vmstat 1 while this is happening?

    – Mark Plotnick
    May 3 '18 at 16:54






  • 2





    As I mentioned, everything is locked. I tried ssh'ing from another system it just times out.

    – John Terragon
    May 3 '18 at 16:59






  • 2





    If I start vmstat 1 with stdout output, I think it's going to freeze. But you're right, I could just start vmstat 1>somefile directly from the system and then see what it reports after the system has come back to life. I'll try that.

    – John Terragon
    May 4 '18 at 11:22






  • 2





    I used vmstat. Results in the update above.

    – John Terragon
    May 4 '18 at 13:05






  • 3





    swappiness is the default 60 (not that changing it gives a better result). The kernel used with the vmstat run is 4.14.35 but I've tried 4.15, 4.16 and I've even gone back to the 4.0 series (!): always the same behavior. And it's not that I'm using some weird distribution, it's just debian. I don't use the kernel images from debian (not that mine have unusual configs) but I've tried one of those...same behavior.

    – John Terragon
    May 4 '18 at 14:59








1




1





Can you ssh into your system from another system and run vmstat 1 while this is happening?

– Mark Plotnick
May 3 '18 at 16:54





Can you ssh into your system from another system and run vmstat 1 while this is happening?

– Mark Plotnick
May 3 '18 at 16:54




2




2





As I mentioned, everything is locked. I tried ssh'ing from another system it just times out.

– John Terragon
May 3 '18 at 16:59





As I mentioned, everything is locked. I tried ssh'ing from another system it just times out.

– John Terragon
May 3 '18 at 16:59




2




2





If I start vmstat 1 with stdout output, I think it's going to freeze. But you're right, I could just start vmstat 1>somefile directly from the system and then see what it reports after the system has come back to life. I'll try that.

– John Terragon
May 4 '18 at 11:22





If I start vmstat 1 with stdout output, I think it's going to freeze. But you're right, I could just start vmstat 1>somefile directly from the system and then see what it reports after the system has come back to life. I'll try that.

– John Terragon
May 4 '18 at 11:22




2




2





I used vmstat. Results in the update above.

– John Terragon
May 4 '18 at 13:05





I used vmstat. Results in the update above.

– John Terragon
May 4 '18 at 13:05




3




3





swappiness is the default 60 (not that changing it gives a better result). The kernel used with the vmstat run is 4.14.35 but I've tried 4.15, 4.16 and I've even gone back to the 4.0 series (!): always the same behavior. And it's not that I'm using some weird distribution, it's just debian. I don't use the kernel images from debian (not that mine have unusual configs) but I've tried one of those...same behavior.

– John Terragon
May 4 '18 at 14:59





swappiness is the default 60 (not that changing it gives a better result). The kernel used with the vmstat run is 4.14.35 but I've tried 4.15, 4.16 and I've even gone back to the 4.0 series (!): always the same behavior. And it's not that I'm using some weird distribution, it's just debian. I don't use the kernel images from debian (not that mine have unusual configs) but I've tried one of those...same behavior.

– John Terragon
May 4 '18 at 14:59










1 Answer
1






active

oldest

votes


















-3














You are only allocating memory - you don't actually put anything in it.
A "normal" program would allocate a chunk and then start using it.
Allocation is not the same as memory usage.






share|improve this answer



















  • 3





    Welcome to posting on Unix StackExchange. It does put data in it, that data just happens to be zero. See the memset(). Linux kernel provides a physical page of RAM as soon as you write to the virtual page; it does not look at the specific value which is written.

    – sourcejedi
    May 23 '18 at 13:50













  • Actually, I compiled & ran this on my desktop starting with 2GB used, 6GB free. It actually swapped out at a slow rate initially and only when it hit the limit did it swap out aggressively - which then caused various GUI actions to seize up.

    – Jeremy Boden
    May 25 '18 at 20:04













Your Answer








StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f441590%2fis-this-how-linux-paging-should-behave-because-it-seems-awful%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









-3














You are only allocating memory - you don't actually put anything in it.
A "normal" program would allocate a chunk and then start using it.
Allocation is not the same as memory usage.






share|improve this answer



















  • 3





    Welcome to posting on Unix StackExchange. It does put data in it, that data just happens to be zero. See the memset(). Linux kernel provides a physical page of RAM as soon as you write to the virtual page; it does not look at the specific value which is written.

    – sourcejedi
    May 23 '18 at 13:50













  • Actually, I compiled & ran this on my desktop starting with 2GB used, 6GB free. It actually swapped out at a slow rate initially and only when it hit the limit did it swap out aggressively - which then caused various GUI actions to seize up.

    – Jeremy Boden
    May 25 '18 at 20:04


















-3














You are only allocating memory - you don't actually put anything in it.
A "normal" program would allocate a chunk and then start using it.
Allocation is not the same as memory usage.






share|improve this answer



















  • 3





    Welcome to posting on Unix StackExchange. It does put data in it, that data just happens to be zero. See the memset(). Linux kernel provides a physical page of RAM as soon as you write to the virtual page; it does not look at the specific value which is written.

    – sourcejedi
    May 23 '18 at 13:50













  • Actually, I compiled & ran this on my desktop starting with 2GB used, 6GB free. It actually swapped out at a slow rate initially and only when it hit the limit did it swap out aggressively - which then caused various GUI actions to seize up.

    – Jeremy Boden
    May 25 '18 at 20:04
















-3












-3








-3







You are only allocating memory - you don't actually put anything in it.
A "normal" program would allocate a chunk and then start using it.
Allocation is not the same as memory usage.






share|improve this answer













You are only allocating memory - you don't actually put anything in it.
A "normal" program would allocate a chunk and then start using it.
Allocation is not the same as memory usage.







share|improve this answer












share|improve this answer



share|improve this answer










answered May 23 '18 at 13:43









Jeremy BodenJeremy Boden

11




11








  • 3





    Welcome to posting on Unix StackExchange. It does put data in it, that data just happens to be zero. See the memset(). Linux kernel provides a physical page of RAM as soon as you write to the virtual page; it does not look at the specific value which is written.

    – sourcejedi
    May 23 '18 at 13:50













  • Actually, I compiled & ran this on my desktop starting with 2GB used, 6GB free. It actually swapped out at a slow rate initially and only when it hit the limit did it swap out aggressively - which then caused various GUI actions to seize up.

    – Jeremy Boden
    May 25 '18 at 20:04
















  • 3





    Welcome to posting on Unix StackExchange. It does put data in it, that data just happens to be zero. See the memset(). Linux kernel provides a physical page of RAM as soon as you write to the virtual page; it does not look at the specific value which is written.

    – sourcejedi
    May 23 '18 at 13:50













  • Actually, I compiled & ran this on my desktop starting with 2GB used, 6GB free. It actually swapped out at a slow rate initially and only when it hit the limit did it swap out aggressively - which then caused various GUI actions to seize up.

    – Jeremy Boden
    May 25 '18 at 20:04










3




3





Welcome to posting on Unix StackExchange. It does put data in it, that data just happens to be zero. See the memset(). Linux kernel provides a physical page of RAM as soon as you write to the virtual page; it does not look at the specific value which is written.

– sourcejedi
May 23 '18 at 13:50







Welcome to posting on Unix StackExchange. It does put data in it, that data just happens to be zero. See the memset(). Linux kernel provides a physical page of RAM as soon as you write to the virtual page; it does not look at the specific value which is written.

– sourcejedi
May 23 '18 at 13:50















Actually, I compiled & ran this on my desktop starting with 2GB used, 6GB free. It actually swapped out at a slow rate initially and only when it hit the limit did it swap out aggressively - which then caused various GUI actions to seize up.

– Jeremy Boden
May 25 '18 at 20:04







Actually, I compiled & ran this on my desktop starting with 2GB used, 6GB free. It actually swapped out at a slow rate initially and only when it hit the limit did it swap out aggressively - which then caused various GUI actions to seize up.

– Jeremy Boden
May 25 '18 at 20:04




















draft saved

draft discarded




















































Thanks for contributing an answer to Unix & Linux Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f441590%2fis-this-how-linux-paging-should-behave-because-it-seems-awful%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How to reconfigure Docker Trusted Registry 2.x.x to use CEPH FS mount instead of NFS and other traditional...

is 'sed' thread safe

How to make a Squid Proxy server?