在浏览某些网站时,什么会使 Linux 无响应几分钟?

use*_*980 28 linux freeze

我使用的是 Linux 4.15,当我浏览谷歌、Facebook 或任何其他资源匮乏的网站时,这种情况发生在我身上很多次 - 整个操作系统变得无响应、冻结和无用。我看到它唯一能工作的是磁盘(主系统分区格式化为 ext4),它被大量使用(I/O 节流)。

我被迫等待一分钟或更长时间才能摆脱臃肿,有时它会保持12分钟无响应,因此我感到沮丧。操作系统无法很好地处理多任务处理这一事实往往反映了一种绝对奇怪和不可接受的行为。

不仅发生这种情况与Firefox,但与任何的JavaScript解释器应用程序,包括微软VSCode角-CLIng serve命令),以及执行任何其他渴求资源的线程-例如的情况下plantuml生成从一个非常大的图形时非常复杂的UML图。

今天,在为最近从坏 USB 端口拔下的外部 HDD(通过 ext4 分区)启动数据恢复软件后,操作系统变得完全无法管理。

我无法说出这种错误行为背后的根本原因

我在浏览器中打开了许多选项卡,并且根据df输出使用了 94% 的操作系统分区:

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
Run Code Online (Sandbox Code Playgroud)

作为硬件,我正在使用:

  1. 英特尔酷睿 i3 v2348M 如下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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 8 GB 内存。(见htop下面的输出)。

  3. 99.83 MHz 主板总线速度
  4. 500 GB 内置硬盘 - 这是来自操作系统的 SMART 报告:

    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.
    
    Run Code Online (Sandbox Code Playgroud)

这些是每个资源使用的结果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
Run Code Online (Sandbox Code Playgroud)

这些也是 VM 统计信息的结果,由命令生成vmstat 5

AFAIK,英国媒体报道不应该使操作系统无响应,所以我不会考虑甚至不接受英国媒体报道是问题的根本原因——因为操作系统工作是隔离进程并确保多任务处理。

我不知道这个问题是特定于操作系统、特定于硬件还是特定于配置。

有任何想法吗?

sou*_*edi 29

是什么让 Linux 如此迟钝?

过度使用可用 RAM 会导致大量交换,绝对可以做到这一点。请记住,机械硬盘上的随机访问 I/O 需要移动读/写磁头,每秒只能执行大约 100 次搜索。

如果您“过多地”过度使用 RAM,Linux 通常会完全出去吃午饭。我还有一个旋转磁盘和 8GB RAM。我遇到了一些内存泄漏软件的问题。也就是说,它们的内存使用量会随着时间的推移不断增长并且永远不会减少,因此控制它的唯一方法是停止软件然后重新启动它。根据我在此期间的经验,如果您生成 3GB 以上的交换,听到延迟超过 10 分钟我并不感到惊讶。

在您拥有超过 3GB 的交换空间的所有情况下,您不一定会看到这一点。理论说关键概念是颠簸。另一方面,如果您尝试在两个不同的工作集之间切换,并且需要交换 3GB 的进出,在 100MB/s 下,即使 I/O 模式可以完美优化,也至少需要 60 秒。在实践中,I/O 模式远非最佳。

在我遇到困难之后,我将交换空间重新格式化为 2GB(比以前小了几倍),因此系统将无法进行如此深的交换。您甚至可以在不调整分区大小的情况下执行此操作,因为mkswap需要一个可选的大小参数。

粗略的平衡是在内存不足和进程被杀死之间,以及让系统挂起太久以至于你放弃并重新启动之间的平衡。不知道4GB的swap分区是不是太大了;这可能取决于你在做什么。重要的是要注意磁盘何时开始搅动,检查您的内存使用情况,并做出相应的响应。

检查多进程应用程序的内存使用情况很困难。要在不重复计算共享内存的情况下查看每个进程的内存使用情况,您可以使用sudo atop -R、按Mm并查看 PSIZE 列。您也可以使用smem. smem -t -P firefox将显示所有 Firefox 进程的 PSS,然后是总 PSS 的一行。这是测量基于 Firefox 或 Chrome 浏览器的总内存使用量的正确方法。(虽然也有用于显示内存使用情况的浏览器特定功能,这些功能将显示各个选项卡)。

  • @TobySpeight 如果你想限制应用内存使用,那么你需要使用 cgroups。`ulimit` 真的没有帮助。 (2认同)
  • `重要的是要注意磁盘何时开始搅动,检查您的内存使用情况,并做出相应的响应。` <-- 或者,如果您使用 GUI,制作一个运行简单脚本的 crontab(每分钟左右)它会检查您还剩多少可用 RAM,并警告您。我为 Linux Mint 制作了自己的版本,并从中学到了很多东西。这是你可以尝试和玩的东西。 (2认同)

小智 5

AFAIK,英国媒体报道不应该使操作系统无响应,所以我不会考虑甚至不接受英国媒体报道是问题的根本原因

你不会喜欢这个,但我认为英国媒体报道你的问题(虽然我不确定是内存还是磁盘的问题)。不幸的是,Linux 内核在处理高内存压力情况方面很糟糕,而且众所周知,一旦内存耗尽,基本上需要重新启动。有三件事让我相信您的问题是资源枯竭:

  1. 根 (/) 和 DATA 上的磁盘空间几乎已满。我不确定你用 DATA 做什么,但我之前遇到过将我的根分区调整得太小并且我的系统无法运行的问题。
  2. 您的内存压力很大,这意味着您的 RAM 几乎已满。当 RAM 开始变满时,您将开始出现页面错误。当内核无法为进程分配足够的内存而必须转而使用某些系统慢得多的交换空间时,就会发生页面错误。这导致我们最后的观察:
  3. 您的交换空间几乎已满。由于 RAM 和交换区几乎已满,因此您的系统显然存在一些高内存压力。

基本上,将这三个放在一起,您的系统就没有足够的资源来做任何事情。不幸的是,Linux 处理低内存情况的能力很差(与 Windows 中的 NT 内核相比),但这似乎就是事实。您可以在此 Reddit 线程及其链接的邮件列表中找到更多讨论。

至于如何解决您的情况,我会说增加交换大小是个好主意,但由于磁盘空间不足,这将是一个问题。除非你的 Minecraft 服务器有很多人,否则我认为将它的内存减少到 1024m 左右是安全的(我个人使用 1024m 大约 10 个人,它工作正常)。我还会为您的 Minecraft 服务器使用 spigot 或 paper,因为它们往往性能更高。

祝你好运!

  • 显然是内存的问题,而不是磁盘。Linux 在高内存压力下确实很糟糕。但是需要重新启动是不正确的。如果您设法释放一些内存,Linux 将变得与内存压力超过可用容量之前一样响应。 (7认同)
  • 我听说一般使用交换是一个坏主意?至少在服务器环境中,冻结 12 分钟是不可接受的? (2认同)
  • @Kais,以我的经验,Windows 使用非 GUI 程序更糟,但如果内存压力高,它会挂起非前台 GUI 程序,这解决了桌面问题,假设桌面应用程序没有后台任务。 (2认同)
  • 可能是香草 Minecraft;但是在玩家加入之前,大型模组包很容易达到 3 GiB :) (2认同)