阅读包裹清单需要永远

Dre*_*Dre 28 command-line apt

我一直试图在我的机器上更新我的东西,它似乎无法读取我的包列表。似乎每次我做sudo apt-get install *something* && sudo apt-get update它都会卡在阅读包列表中,这以前不是问题。这是我的规格和诸如此类的东西:

  • 内存:15.8GB
  • 处理器 : AMD Phenom(tm) II x4 965 处理器 x 4
  • 图形: AMD BARTS 上的镓 0.4
  • 操作系统类型:32 位
  • 网速: 在此处输入图片说明

Sté*_*las 24

我也看到了。

我没有解决方案,但我有一个解决方法 ( echo 3 | sudo tee /proc/sys/vm/drop_caches) 和潜在的更多信息,因此有人可以进一步进行调查。

这不是网络问题,因为在"Reading package list...",它只是读取/var/lib/apt/lists/. A:

strace -tt -T -fo strace.log apt-get update
Run Code Online (Sandbox Code Playgroud)

给出:

16394 14:43:03.921130 open("/var/lib/apt/lists/gb.archive.ubuntu.com_ubuntu_dists_precise_main_binary-i386_Packages", O_RDONLY|O_LARGEFILE) = 7 <0.000012>
[...]
16394 14:43:03.995238 read(6, "-3.1ubuntu2)\nConflicts: linux86\n"..., 32444) = 32444 <0.000111>
16394 14:43:05.787187 read(6, "c (<< 1:14.b.4-dfsg), erlang-exa"..., 32239) = 32239 <0.000069>
16394 14:43:05.788025 read(6, ".deb\nSize: 42130\nMD5sum: c7de671"..., 31695) = 31695 <0.000068>
16394 14:43:05.870734 read(6, "5: 29c4b395a92bdc12932f151c3643a"..., 31607) = 31607 <0.000071>
16394 14:43:05.890862 read(6, "e-pack-af-base\nFilename: pool/ma"..., 32538) = 32538 <0.000070>
16394 14:43:05.891425 read(6, "buntu-usb-live, ubuntu-dvd-live,"..., 32090) = 32090 <0.000066>
16394 14:43:05.891960 read(6, "cd9755b03ac2c9b8251125c7b6618\nDe"..., 32195) = 32195 <0.000034>
16394 14:43:06.043001 read(6, "rg>\nArchitecture: all\nVersion: 2"..., 32535) = 32535 <0.000072>
Run Code Online (Sandbox Code Playgroud)

看看这 8 个read系统调用是如何花费超过 2 秒的,即使每个单独的调用花费不到 1 毫秒。运行time apt-get update或查看top,该进程在这两个调用之间并不忙。那么为什么会延迟呢?

然后我做了:

echo t > /proc/sysrq-trigger
Run Code Online (Sandbox Code Playgroud)

几次并查看结果kern.log

 apt-get         D 00000000     0 16790  12706 0x00000000
  e8695d30 00000086 f7bd5e6c 00000000 f7bd5e44 f74a6580 c1990e00 c1990e00
  efe46efe 000042cb f7b9de00 e71a7230 f74a6580 c107e116 00000000 00000000
  044aa200 00000000 00000000 00000000 00000000 e8695d0c e8695d0c c1038de8
 Call Trace:
  [<c107e116>] ? enqueue_entity+0x186/0x220
  [<c1038de8>] ? default_spin_lock_flags+0x8/0x10
  [<c15e13bd>] ? _raw_spin_lock_irqsave+0x2d/0x40
  [<c15e0533>] schedule+0x23/0x60
  [<c15deecf>] schedule_timeout+0x12f/0x290
  [<c1075c38>] ? ttwu_do_activate.constprop.86+0x58/0x70
  [<c1055190>] ? usleep_range+0x40/0x40
  [<c15e0846>] io_schedule_timeout+0x86/0xd0
  [<c15cef7d>] balance_dirty_pages.isra.17+0x3f5/0x4b4
  [<c15e118d>] ? _raw_spin_lock+0xd/0x10
  [<c1180781>] ? __set_page_dirty_buffers+0x81/0xb0
  [<c110deb5>] ? set_page_dirty+0x55/0x60
  [<c11812c9>] ? __block_page_mkwrite+0xe9/0x170
  [<c110f3ae>] balance_dirty_pages_ratelimited_nr+0xde/0x100
  [<c1126f53>] do_wp_page+0x503/0x830
  [<c1128ef7>] handle_pte_fault+0x267/0x2c0
  [<c1129c62>] handle_mm_fault+0x1e2/0x280
  [<c15e4988>] do_page_fault+0x158/0x4c0
  [<c104e4dc>] ? irq_exit+0x5c/0xa0
  [<c15e22d0>] ? do_debug+0x180/0x180
  [<c15e4830>] ? vmalloc_fault+0x195/0x195
  [<c15e1c53>] error_code+0x67/0x6c
Run Code Online (Sandbox Code Playgroud)

所以,不确定这意味着什么,但这看起来是关于页面错误的处理,因此指向潜在的内存管理问题。

然后我尝试了一个:

echo 3 >/proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

这确实使问题消失了。

现在,它看起来很像内核问题。所以,我已经更新到最新的内核(从 3.8 向后移植raring),这就是我所处的位置。如果问题在较新的内核上仍然存在,将进行更新。

编辑

问题在新内核中仍然存在,尽管没有那么严重。同样的事情,

echo 3 | sudo tee /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

暂时解决问题。我只在 MSI 笔记本电脑上看到过这种情况(产品名称:CR61 2M/CX61 2OC/CX61 2OD)。

2015 年 12 月编辑

正如btrace aptitude/所确认的apt-get那样,当时似乎会进行一些磁盘 I/O。它/var/cache/apt/pkgcache.bin.<random-chars>在内存中映射了一个临时文件 ( ),这就是它没有显示在strace输出中的原因。

仍然无法解释为什么它只发生在某些机器上,为什么删除缓存有帮助,为什么切换到 64 位有帮助。

如果有人可以重现它,一个有趣的测试可能是看看在运行时是否也会发生这种情况,eatmydata或者移动/var/cache/apttmpfs或 ramdisk 是否有帮助。


Ben*_*kin 5

http://antti-juhani.kaijanaho.fi/newblog/archives/521上的建议在各种计算机上为我加速了几次:

sudo dpkg --clear-avail
sudo sync-available
Run Code Online (Sandbox Code Playgroud)

(该博客还推荐sudo dpkg --forget-old-unavail了 2 个步骤,但显然它已被弃用,不再需要。)


小智 4

按照步骤:

还要检查并删除任何不需要的 PPA 和源代码行。