28

I'm using Linux 4.15, and this happens to me many times when I browse Google, Facebook or any other resource-hungry website - The whole OS becomes unresponsive, frozen and useless. The only thing I see it to be working is the disk (main system partition formatted as ext4), which is massively in use (I/O throttling).

I get forced to wait for a minute or more to get rid of the bloat, sometimes it stays unresponsive for twelve minutes, and hence I get frustrated. The fact the OS being not able to well-handle multitasking, tends to reflect an absolutely weird and unacceptable behavior.

Not only this happens with Firefox, but with any javascript-interpreter application including Microsoft VSCode or angular-cli (ng serve command) as well as any other resource-hungry thread of execution - such as the case of plantuml when generating a very large graph from a very complex UML diagram.

Today, the OS becomes totally unmanageable, after launching a data recovery software for an external HDD (over ext4 partition) that got lately unplugged from a bad USB port by little move.

I'm not able to tell the root cause behind such buggy behavior

I have many tabs opened in the browser, and 94% OS-partition usage as per df output:

Filesystem     1K-blocks      Used Available Use% Mounted on
udev             3964160         0   3964160   0% /dev
tmpfs             798164      3192    794972   1% /run
/dev/sda5      173466400 153224316  11407424  94% /
tmpfs            3990820     62936   3927884   2% /dev/shm
tmpfs               5120         4      5116   1% /run/lock
tmpfs            3990820         0   3990820   0% /sys/fs/cgroup
/dev/loop5           128       128         0 100% /snap/anbox-installer/24
/dev/loop2           128       128         0 100% /snap/anbox-installer/17
/dev/loop4        223616    223616         0 100% /snap/kde-frameworks-5/26
/dev/loop3         90624     90624         0 100% /snap/core/7169
/dev/loop7        223616    223616         0 100% /snap/kde-frameworks-5/25
/dev/loop8         90624     90624         0 100% /snap/core/7270
/dev/loop0         87552     87552         0 100% /snap/qownnotes/2160
/dev/loop1        241664    241664         0 100% /snap/kde-frameworks-5/27
tmpfs             798164         0    798164   0% /run/user/0
tmpfs             798164        32    798132   1% /run/user/1000
/dev/loop9         87552     87552         0 100% /snap/qownnotes/2176
/dev/sda3      188669948 187132488   1537460 100% /media/kais/DATA
/dev/sdb1       15142960   2091904  13051056  14% /media/kais/STORE N GO

As hardware, I'm using:

  1. Intel Core i3 v2348M as per lscpu:

    Architecture:        x86_64
    CPU op-mode(s):      32-bit, 64-bit
    Byte Order:          Little Endian
    Address sizes:       36 bits physical, 48 bits virtual
    CPU(s):              4
    On-line CPU(s) list: 0-3
    Thread(s) per core:  2
    Core(s) per socket:  2
    Socket(s):           1
    NUMA node(s):        1
    Vendor ID:           GenuineIntel
    CPU family:          6
    Model:               42
    Model name:          Intel(R) Core(TM) i3-2348M CPU @ 2.30GHz
    Stepping:            7
    CPU MHz:             905.312
    CPU max MHz:         2300.0000
    CPU min MHz:         800.0000
    BogoMIPS:            4589.49
    Virtualization:      VT-x
    L1d cache:           32K
    L1i cache:           32K
    L2 cache:            256K
    L3 cache:            3072K
    NUMA node0 CPU(s):   0-3
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx lahf_lm epb pti tpr_shadow vnmi flexpriority ept vpid xsaveopt dtherm arat pln pts
    
  2. 8 GB of RAM. (See htop output below).

  3. 99.83 MHz of mainboard bus speed
  4. 500 GB internal HDD - This is the S.M.A.R.T. report from the operating system:

    smartctl 6.6 2017-11-05 r4594 [x86_64-linux-4.15.0-33-generic] (local build)
    Copyright (C) 2002-17, Bruce Allen, Christian Franke, www.smartmontools.org
    
    === START OF INFORMATION SECTION ===
    Model Family:     Western Digital Blue Mobile
    Device Model:     WDC WD5000LPVX-22V0TT0
    Serial Number:    WD-WXE1E13AAMR4
    LU WWN Device Id: 5 0014ee 25db04ba7
    Firmware Version: 01.01A01
    User Capacity:    500,107,862,016 bytes [500 GB]
    Sector Sizes:     512 bytes logical, 4096 bytes physical
    Rotation Rate:    5400 rpm
    Device is:        In smartctl database [for details use: -P show]
    ATA Version is:   ACS-2 (minor revision not indicated)
    SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 6.0 Gb/s)
    Local Time is:    Wed Aug  7 15:52:05 2019 CET
    SMART support is: Available - device has SMART capability.
    SMART support is: Enabled
    
    === START OF READ SMART DATA SECTION ===
    SMART overall-health self-assessment test result: PASSED
    
    General SMART Values:
    Offline data collection status:  (0x00) Offline data collection activity
                        was never started.
                        Auto Offline Data Collection: Disabled.
    Self-test execution status:      (   0) The previous self-test routine completed
                        without error or no self-test has ever 
                        been run.
    Total time to complete Offline 
    data collection:        ( 8040) seconds.
    Offline data collection
    capabilities:            (0x7b) SMART execute Offline immediate.
                        Auto Offline data collection on/off support.
                        Suspend Offline collection upon new
                        command.
                        Offline surface scan supported.
                        Self-test supported.
                        Conveyance Self-test supported.
                        Selective Self-test supported.
    SMART capabilities:            (0x0003) Saves SMART data before entering
                        power-saving mode.
                        Supports SMART auto save timer.
    Error logging capability:        (0x01) Error logging supported.
                        General Purpose Logging supported.
    Short self-test routine 
    recommended polling time:    (   2) minutes.
    Extended self-test routine
    recommended polling time:    (  93) minutes.
    Conveyance self-test routine
    recommended polling time:    (   5) minutes.
    SCT capabilities:          (0x7035) SCT Status supported.
                        SCT Feature Control supported.
                        SCT Data Table supported.
    
    SMART Attributes Data Structure revision number: 16
    Vendor Specific SMART Attributes with Thresholds:
    ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
      1 Raw_Read_Error_Rate     0x002f   200   200   051    Pre-fail  Always       -       1
      3 Spin_Up_Time            0x0027   149   143   021    Pre-fail  Always       -       1541
      4 Start_Stop_Count        0x0032   057   057   000    Old_age   Always       -       43173
      5 Reallocated_Sector_Ct   0x0033   200   200   140    Pre-fail  Always       -       0
      7 Seek_Error_Rate         0x002e   200   200   000    Old_age   Always       -       0
      9 Power_On_Hours          0x0032   083   083   000    Old_age   Always       -       12797
     10 Spin_Retry_Count        0x0032   100   100   000    Old_age   Always       -       0
     11 Calibration_Retry_Count 0x0032   100   100   000    Old_age   Always       -       0
     12 Power_Cycle_Count       0x0032   091   091   000    Old_age   Always       -       9496
    191 G-Sense_Error_Rate      0x0032   001   001   000    Old_age   Always       -       250
    192 Power-Off_Retract_Count 0x0032   200   200   000    Old_age   Always       -       399
    193 Load_Cycle_Count        0x0032   147   147   000    Old_age   Always       -       160989
    194 Temperature_Celsius     0x0022   101   092   000    Old_age   Always       -       42
    196 Reallocated_Event_Count 0x0032   200   200   000    Old_age   Always       -       0
    197 Current_Pending_Sector  0x0032   200   200   000    Old_age   Always       -       0
    198 Offline_Uncorrectable   0x0030   100   253   000    Old_age   Offline      -       0
    199 UDMA_CRC_Error_Count    0x0032   200   200   000    Old_age   Always       -       0
    200 Multi_Zone_Error_Rate   0x0008   100   253   000    Old_age   Offline      -       0
    
    SMART Error Log Version: 1
    No Errors Logged
    
    SMART Self-test log structure revision number 1
    No self-tests have been logged.  [To run self-tests, use: smartctl -t]
    
    SMART Selective self-test log data structure revision number 1
     SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
        1        0        0  Not_testing
        2        0        0  Not_testing
        3        0        0  Not_testing
        4        0        0  Not_testing
        5        0        0  Not_testing
    Selective self-test flags (0x0):
      After scanning selected spans, do NOT read-scan remainder of disk.
    If Selective self-test is pending on power-up, resume after 0 minute delay.
    

These are the results of resource usage per htop:

  1  [|||||                    14.1%]   Tasks: 286, 1497 thr; 2 running
  2  [|||||                    13.2%]   Load average: 3.00 4.97 6.09 
  3  [|||||                    12.5%]   Uptime: 3 days, 16:12:35
  4  [|||                       9.3%]
  Mem[|||||||||||||||||||5.09G/7.61G]
  Swp[|||||||||||||||||||3.68G/4.65G]

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 7006 jvb        20   0 6640M  102M  6780 S  5.3  1.3 18:53.18 java -Xmx3072m -X
 8224 kais     20   0 4537M  771M  200M S  6.6  9.9  2h31:23 /usr/lib/firefox/
 2299 kais     20   0 2958M  184M 42912 S  5.3  2.4 13:54.41 /usr/lib/firefox/
 1216 root       20   0  519M  120M 94640 S  5.3  1.5  1h52:50 /usr/lib/xorg/Xor
28401 kais     20   0 3354M  584M  107M S  7.9  7.5 34:44.51 /usr/lib/firefox/
 8439 kais     20   0 4537M  771M  200M S  4.6  9.9 37:06.21 /usr/lib/firefox/
 8831 kais     20   0 3222M  351M 64828 R  4.0  4.5 11:19.87 /usr/lib/firefox/
 7025 jvb        20   0 6640M  102M  6780 S  0.0  1.3  0:18.34 java -Xmx3072m -X
 7027 jvb        20   0 6640M  102M  6780 S  0.0  1.3  0:18.05 java -Xmx3072m -X
 5901 kais     20   0  7492  5612  2904 R  4.0  0.1  0:00.66 htop
 5329 kais     20   0  547M 47456 38388 S  1.3  0.6  0:01.29 /usr/lib/gnome-te
13540 kais     20   0 2958M  184M 42912 S  2.0  2.4  0:06.25 /usr/lib/firefox/
16897 kais     20   0  904M 28292 18076 S  2.0  0.4 50:08.37 pavucontrol
17999 kais     20   0 2424M 29460 25380 S  1.3  0.4 52:41.73 /usr/bin/pulseaud
F1 Help  F2 Setup  F3 Search  F4 Filter  F5 Tree  F6 SortBy F7 Nice  -  F8 Nice  +  F9 Kill  F10 Quit

Those are the results of VM statistics as well, generated by the command vmstat 5.

AFAIK, bloatware shouldn't make the OS unresponsive, so I wouldn't consider or even accept that the bloatware is the root cause of the problem - since the OS job is isolating processes and ensuring multitasking.

I don't know whether this issue is OS-specific, hardware-specific, or configuration-specific.

Any ideas?

  • 4
    Comments are not for extended discussion; this conversation has been moved to chat. Please make sure to update the Question as needed for any clarifications that result from the comments/chat. Thank you! – Jeff Schaller Aug 7 at 15:23
  • 3
    I suspect your system is swapping a lot; can you run vmstat 5 while your system is acting up? It's ok to start vmstat beforehand and post the rows that are printed during freezes. I'm looking specifically for the si and so columns, which indicate how much the system is actually swapping. Also, can you post the output of top, sorted by memory usage (shift-M)? (or whatever the equivalent htop mode is) – marcelm Aug 8 at 8:19
  • 1
    When a file system is almost full it can become very slow. I'm not sure if this is likely the case with ext4. – Nobody Aug 8 at 15:43
  • 1
    @Kais Try both and see what works? My swap fills at maximum to half of what I prepared and it doesn't cause me any freezes. Whether one experiences slowdowns or not from swap use also depends on usage patterns I think, so our experiences may differ. – JoL Aug 8 at 17:14
  • 2
    Try disabling swap entirely - that will confirm or eliminate disk thrashing as the source of the problem. The point of swapping is to put unused pages on disk, but if most of the pages are really in use, then swapping won't help. If your typical workload requires 10GB of resident pages, then an 8GB machine will struggle. The answer to resource exhaustion is to either lower the workload or increase the resource (in this case, try chrome or add more physical memory). – bain Aug 9 at 12:06
27

What can make Linux so unresponsive?

Overcommitting available RAM, which causes a large amount of swapping, can definitely do this. Remember that random access I/O on your mechanical HDD requires moving a read/write head, which can only do around 100 seeks per second.

It's usual for Linux to go totally out to lunch, if you overcommit RAM "too much". I also have a spinny disk and 8GB RAM. I have had problems with a couple of pieces of software with memory leaks. I.e. their memory usage keeps growing over time and never shrinks, so the only way to control it would have been to stop the software and then restart it. Based on the experiences I had during this, I am not very surprised to hear delays over ten minutes, if you are generating 3GB+ of swap.

You won't necessarily see this in all cases where you have more than 3GB of swap. Theory says the key concept is thrashing. On the other hand, if you are trying to switch between two different working sets, and it requires swapping 3GB in and out, at 100MB/s it will take at least 60 seconds even if the I/O pattern can be perfectly optimized. In practice, the I/O pattern will be far from optimal.

After the difficulty I had with this, I reformatted my swap space to 2GB (several times smaller than before), so the system would not be able to swap as deeply. You can do this even without messing around resizing the partition, because mkswap takes an optional size parameter.

The rough balance is between running out of memory and having processes get killed, and having the system hang for so long that you give up and reboot anyway. I don't know if a 4GB swap partition is too large; it might depend what you're doing. The important thing is to watch out for when the disk starts churning, check your memory usage, and respond accordingly.

Checking memory usage of multi-process applications is difficult. To see memory usage per-process without double-counting shared memory, you can use sudo atop -R, press M and m, and look in the PSIZE column. You can also use smem. smem -t -P firefox will show PSS of all your firefox processes, followed by a line with total PSS. This is the correct approach to measure total memory usage of Firefox or Chrome based browsers. (Though there are also browser-specific features for showing memory usage, which will show individual tabs).

  • 1
    Comments are not for extended discussion; this conversation has been moved to chat. – Jeff Schaller Aug 8 at 13:44
  • Might be worth considering the use of ulimit to attempt to control the processes' usage (it's tricky with a multi-process application, but might be helpful). – Toby Speight Aug 9 at 7:27
  • 2
    @TobySpeight if you want to limit app memory usage then you need to use cgroups. ulimit really doesn't help. – sourcejedi Aug 9 at 10:59
  • Yes, that's likely a better choice. It's really worth mentioning in the answer, anyway. – Toby Speight Aug 9 at 11:25
  • 2
    The important thing is to watch out for when the disk starts churning, check your memory usage, and respond accordingly. <-- or, if you use a GUI, make a crontab that runs a simple script (every minute or so) that checks how much free RAM you have left, warning you of it. I made my own for Linux Mint, and i learned quite a bit from it. It's something you can try and play around with. – Ismael Miguel Aug 9 at 14:31
5

AFAIK, bloatware shouldn't make the OS unresponsive, so I wouldn't consider or even accept that the bloatware is the root cause of the problem

You're not going to like this, but I think bloatware is your problem (although I'm not sure if it's memory or disk which is the problem). Unfortunately, the Linux kernel is awful at handling high memory pressure situations, and is known to basically require a reboot once memory is exhausted. There are three things which lead me to believe your issue is resource exhaustion:

  1. Your disk space on root (/) and DATA is almost full. I'm not sure what you use DATA for, but I've ran into issues before with resizing my root partition too small and my system becoming inoperable.
  2. You have high-memory pressure, meaning that your RAM is almost full. When RAM starts to get full you will start to get page faults. Page faults happen when the kernel is unable to allocate enough memory for a process and must instead use some of the systems much slower swap space. This leads us to our last observation:
  3. Your swap space is almost full. There's clearly some high memory pressure on your system since both RAM and swap are almost full.

Basically, put these three together and your system doesn't have enough resources available to do much of anything. As for it's unfortunate how poorly Linux handles low-memory situations (compared to, say, the NT kernel in Windows) but that seems to be how it is. You can find more discussion in this Reddit thread and its linked mailing list.

As for how to fix your situation, I would say increasing your swap size is a good idea, but since you're low on disk space that will be a problem. Unless your Minecraft server has a ton of people, I think it would be safe to reduce its memory to something around 1024m (I personally use 1024m with about 10 people and it works fine). I would also use spigot or paper for your Minecraft server since they tend to be more performant.

Good luck!

  • 7
    It's clearly memory that's the problem, not disk. It's true that Linux is bad under high memory pressure. But it's not true that a reboot is required. If you manage to free up some memory, Linux will become just as responsive as it was before the memory pressure exceeded available capacity. – Gilles 'SO- stop being evil' Aug 7 at 23:38
  • 1
    @Kais I said "this leads us to our last observation" as a segue since I was talking about swap space and would continue to talk about it in point 3. About Minecraft, it looked like you were running a Minecraft server, and had allocated 3G of RAM to it. I was just saying that unless you have a ton of people playing on it at the same time, you might not need that much RAM. I said "they tend to be more performant" when talking about paper and spigot, which are alternative Minecraft servers which feature better performance over vanilla MC. – Chase Aug 8 at 3:06
  • 2
    I've heard that generally using swap at all is a bad idea? A least in server environment, when freezing for 12 minutes is not acceptable? – 9ilsdx 9rvj 0lo Aug 8 at 6:38
  • 2
    @Kais, in my experience, Windows is even worse with non-GUI programs, but it will suspend non-foreground GUI programs if memory pressure is high, which solves the problem for the desktop, under the assumption that desktop applications do not have background tasks. – Simon Richter Aug 8 at 8:58
  • 2
    Vanilla Minecraft maybe; but large modpacks easily get to 3 GiB before a player even joins in :) – Luaan Aug 9 at 6:54
4

What's the output of free -m? The amount of RAM you have is pointless if we don't know how much you're using. That and I'm interested to know how much swap space is being used.

I do think you've answered your own question, though. Having open "many tabs" open in your browser can definitely slow down your system if you're never closing them, as they'll continue to consume memory regardless; when your system freezes, how many do you have open at a time?

It also makes sense if your system is freezing up from other memory-intensive tasks such as "generating a very large graph from a very complex UML diagram". That will absolutely slow down your system as it generates the graph, so that's hardly a surprise.

It really sounds like this is the way your system is supposed to behave. Either that or I'm missing something here.

By the way, HDD stats don't matter when it comes to your system becoming unresponsive since a lack of memory is almost always the culprit.

  • 1
    "That will absolutely slow down your system" - Yes this is expected, but causing an uncontrollable X session is not expected (i.e result of freezed system), where I cannot see the mouse cursor moving. – Kais Aug 7 at 16:41
  • 1
    That actually would be expected, the behavior you're describing is exactly what happens when I use too much RAM on my system. I've even had my system clog up to the point that I couldn't switch to a text-based terminal, and I've got double the RAM as you. If you ever run into that type of situation where you can't use your X session you've gotta switch to the text-based terminal and kill the offending processes. If that fails, you'd have to do a hard reboot. Bout the best I can tell you. – Zach Sanchez Aug 7 at 16:45
  • 1
    @Kais macOS also becomes sluggish in low memory situations. There's really no way for the system to sensibly decide what memory it absolutely needs to keep in RAM, so switching between applications would swap in and out like crazy, to the point where the UI becomes unresponsive. – Kusalananda Aug 7 at 17:32
  • 5
    ehh, it's not that there aren't much more effective ways to keep the "window manager" UI responsive. MS research wrote a whole experimental OS on a design which forbidded demand-paging. Proof of concept: Run the "window manager" in Midori, emulate Linux apps including swap. There you go, the "window manager" will stay responsive even if apps are swapping. At minimum, it could let you reliably kill some apps to release memory. Linux isn't perfect. Gnome switching from X11 to Wayland even made it significantly worse w.r.t responsiveness on overloaded systems. – sourcejedi Aug 7 at 21:14
  • 2
    HDD stats can matter. One possible cause of unresponsiveness is a failing disk, which causes a huge I/O backlog. But I don't see any evidence of that happening in this case. – 200_success Aug 8 at 3:38
4

When I read the title my immediate thought was "not enough RAM", because I have experienced exactly this problem myself on Linux, 10+ minutes of frantic disk thrashing after opening too many browser tabs. I agree, it's dismal, and needs improvement. Windows handles this situation much better.

Some suggestions:

  • Add a memory monitor applet to your system tray so you can keep an eye on it.
  • In Firefox's preferences, set the "content process limit" to "1". As the text below the setting says: "Additional content processes can improve performance when using multiple tabs, but will also use more memory."
  • Remove or replace any memory-hungry browser addons. Keep your ad blocker, as ads eat more memory than any blocker.
  • Investigate and possibly remove any other memory-hungry programs.

However, the only true solution is to buy more RAM.

Not only will an abundance of RAM prevent this catastrophe from occurring, but it will allow the system to build up a large file cache in RAM, which your system currently can't ever do because it runs so close to the limit. A large file cache will take work away from the HDD and make almost every action on the system feel faster generally. It's worth it.

  • Great answer, thanks a lot. But regarding "Additional content processes can improve performance when using multiple tabs, but will also use more memory." - If I understand correctly, is Firefox able to open up to 8 processes per Tab, per default setting? – Kais Aug 10 at 13:05
  • 1
    @Kais I think it's 1 process per tab. In any case, if you set the limit to 1, it will be 1 process total for all tabs, which should use less memory. – Boann Aug 10 at 13:39
  • Understood, thanks again. – Kais Aug 10 at 13:46
4

Your htop output shows that your need of RAM is higher than its capacity (total RAM+SWAP). So the obvious first consideration to make is to reduce RAM usage or increase RAM availability.

Note that modern-day firefox versions are extremely resource-hungry, due to the way that windows/tabs are given process and memory space. The idea was to avoid crashing tabs bringing the whole browser to it's knees. Is it worth the price? Who can tell... Anyway, I've had a similar problem due to the above, since my Pentium 4 mainboard only supports 2GB of RAM. To avoid possible memory exhausted crashes, I added ~800M swap space on a spare SSD, obviously with the intention to use it as little as possible. I have achieved that by changing a setting known as the swappiness, which determines how eager the kernel is to swap memory pages out. Some useful commands as follows.

Check the current swappiness: cat /proc/sys/vm/swappiness

This may well give you a result around 60, which is quite high for maximum performance on systems with a lower load. For you, obviously this works counter-productive, so you can change the setting using a command such as sysctl vm.swappiness=1 to change the setting while the system is running.

To save these changes, you'll have to look for the file /etc/sysctl.conf. In that file, change the value or add the line vm.swappiness=1.

Mind, this is not a solution in your case, but should make a usable workaround.

Credits https://askubuntu.com/questions/103915/how-do-i-configure-swappiness

source for the answer above, includes further explanation. I found that post very helpful in my case.

  • Thanks for your response. This sounds to be a good recommendation for VM configuration. – Kais Aug 8 at 12:40
2

Some excellent discussion of how the problem is caused, continues and grows. I like to get ahead of problems such as you experience by throwing hardware at the initial computer’s design, and/or upgrading an existing implementation. Can you,

  • add RAM (32GB works great for many setups)

  • replace your hard disk drive with an SSD

  • add an SSD (Solid State Drive) for swap drive

  • create a swap partition in RAM (with 32 or more GB of RAM)

  • get a faster HDD

  • move to a system with faster processing and wider / faster bus architecture.

Some of these hardware upgrades/replacements can be well under $100US. These are not specificto Linux, nor your exact software implementations, but the hardware you are using does not seem adequate to your tasks.

  • 1
    Very useful answer, thanks for pointing out the hardware replacement recommendations. – Kais Aug 8 at 12:41
  • 1
    I do hope it helps. Do not know what type of computer or the specific equipment, so these are generic steps, in order of most likely improvement. Any or all would help out your specific slowdowns that are likely due to thrashing of cache, swap and for faster and fewer disk reads / writes in general – Old Uncle Ho Aug 8 at 13:10
  • 6
    Most of those are good suggestions, but swapping to RAM is basically useless unless you're using zram or zswap for compressed swapping to RAM - they're worthwhile, but swapping to an uncompressed ramdisk just creates exactly as much RAM pressure as it relieves (actually, very slightly more due to overhead). – cas Aug 8 at 13:39
  • I'm not sure why anybody would swap to RAM, except when compressing which seems like a great idea on high-RAM/low-CPU workloads. – Peter - Reinstate Monica Aug 9 at 12:28
  • 1
    @bain: how is it ever better to have pages swapped out to RAM vs. still mapped? They're still using just as many pages of physical RAM unless you use compression. That's where the value is. The only difference is more bookkeeping but maybe cleaner hardware page tables. For startup-only memory that processes basically neglect to unmap, e.g. functions / data that are only touched during startup, swap to disk is better because it doesn't consume any DRAM space. For background daemons that aren't used interactively, latency isn't important so again disk swap wins. – Peter Cordes Aug 10 at 10:44
2

Usually it's "just" X11 that becomes unusable. To get a keystroke from your keyboard to a program, and have it show anything on screen, code in several different processes has to run. (X server to get the keystroke from the kernel, xterm or equivalent to get the event and decide to draw something, then send a message to the X server to draw a glyph from a font.)

Just waving your mouse around over a window with a web browser showing a page with a bunch of Javascript crap can result in a bunch of messages for a bunch of processes, all of which cause those processes to wake up and touch a bunch of data. Presumably including a bunch of "cached" uncompressed bitmaps. So this is highly likely to evict more things that are soon needed.

ctrl+alt+F2 to switch to another virtual console usually makes it possible to log in and run shell commands with only a couple seconds latency when something is causing swap thrashing. It's just bash; the Linux kernel isn't swappable and it has all the VT and
keyboard<->TTY code.


To avoid slowdown when you're not truly thrashing, reducing "swappiness" can help. e.g. I set the /proc/sys/vm/swappiness tunable to 6 on my desktop with 16GB of RAM and a 2GB swap partition on an NVMe SSD. You can read more about tuning for interactive latency (as opposed to server throughput); any guide will mention that tunable.

But if you have any swap at all, Linux will use it before invoking the OOM killer. Keep your swap partition small, just big enough for Linux to page out really stale crap that typically really doesn't get used for a long time. (e.g. memory leaks!)

I haven't had any problems with swap being full. Modern Linux deals with having limited swap space just fine. Chromium (which I use instead of firefox) does sometimes get slowish with dozens of Stack Overflow tabs open, but The Great Suspender is a nice addon for unloading tabs when you're not using them. I think that saves significant RAM for me, although it will only unload tabs where you haven't typed anything in a textbox. It might also be available for Firefox.


As other have suggested, 16GB of RAM is really nice for interactive use with Linux. DRAM prices are relatively low currently; after spiking about 1.5 years ago, they've mostly declined again.

  • Great answer, thanks a bunch. But regarding "a bunch of Javascript crap can result in a bunch of messages for a bunch of processes, all of which cause those processes to wake up and touch a bunch of data" - I'm wondering what are these processes, are they Firefox child processes? – Kais Aug 10 at 12:57
  • @Kais: Window manager, web browser, X server, possibly various other X clients in a more complicated desktop. And any other processes whose windows your mouse waves over (which is what I was thinking when I wrote that sentence). e.g. in KDE, the taskbar is a separate process (plasma) from the kwin window manager. – Peter Cordes Aug 10 at 13:08
  • I use LXDE, so in my case only the Openbox and the XOrg server are the processes which get to wake up? Also, what are the kind of messages that get passed to them? – Kais Aug 10 at 13:27
  • @Kais: X11 protocol messages over a unix-domain socket. Try running xev sometime to see what kind of messages you can get from moving the mouse. Also try strace xev to see the system calls that involves for the client side. – Peter Cordes Aug 10 at 13:33
  • I see, thanks. When running up the xev command, I've got messages only by switching to different windows and clicking on them, but it is not the case when I just move over the mouse. – Kais Aug 10 at 13:43
-2

What can make Linux unresponsive for minutes when browsing certain websites?

You are not using Linux right. Which becomes especially noticeable on a resource limited machine. You don’t need more RAM, nor a faster processor.

Background:

Almost every non-user program’s priority is 0.
Almost every user program’s priority is 20.

To ‘fix’ your issue:

Leave the non-user programs alone, but start changing the priorities (nice levels) of your user programs so they don’t cause you issues. Edit what launches your programs to include nice levels, going from usually not a problem, to the worst offender.

Real World Examples:

KMail:          nice -n 1 kmail -caption "%c" %i %m
LibreOffice:    nice -n 2 libreoffice --writer %U
Firefox:        nice -n 3 firefox %u
WorstOffender:  nice -n 9 {i'm a bad program}

Your WorstOffender will still become unresponsive for minutes, that’s literally a go buy a better box problem, but it now won’t be causing your entire OS (Linux) and everything else you have running to also become unresponsive.

  • 2
    I've worked for decades with Linux both with lots of servers and on my own workstation (often in very limited VM setups), and have not once had to fix a RAM-related performance issue with nice -n. "You don’t need more RAM" - he certainly needs more RAM; or could use ulimit to hard limit the worst offenders so his existing RAM is sufficient again. "You are not using Linux right." is completely off. – AnoE Aug 9 at 11:33
  • And I’ve worked with Linux GUI installs on resource limited hardware for the last 22 years and “nice”ing works to solve keeping “Linux unresponsive for minutes.” – Michael Aug 11 at 13:46
  • I don't deny that it works; I'm just saying that putting it forth as the "right" way to work with Linux may not be the best thing. – AnoE Aug 13 at 11:40

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.