OPENSUSE 12.3 systemd-tmpfiles-setup.service 开机很慢

系统安装使用了有 1 个半月之久,之前开机到登录界面只用 40S 左右,前天突然开机到登录界面变为 4Min+ 以上的时间。下面附上 systemd-analyze blame | head 值

238588ms systemd-tmpfiles-setup.service
3037ms NetworkManager.service
1953ms avahi-daemon.service
1762ms systemd-logind.service
1686ms postfix.service
1255ms fglrxrebuild.service
1132ms systemd-vconsole-setup.service
1071ms systemd-udev-root-symlink.service
974ms cycle.service
931ms dev-mqueue.mount

附件是 systemd-analyze plot > plot.svg
Baidu,Google 后无果,求大神指教!

开机的时候可以按一下 ESC 看具体卡在什么地方了

刚才重启几次看了一下,之前卡在 Reached target swap,之后又卡在 Started show plymonth Boot Screen

只有 Google 或者等高手了

swap 分区出问题了?把 swap 分区干掉重新分一下看看管不管用~

高手来了。

提供下科学思路:

复制 /usr/lib/systemd/system/systemd-tmpfiles-setup.service 到 /etc/systemd/system,这一步又叫 mask,因为 /etc/systemd/system 下面的 service 优先级比 /usr/lib/systemd/system 的高,所以我们可以改那里的来做测试,而不影响系统安装的。

下面打开 /etc/systemd/system/systemd-tmpfiles-setup.service,里面有

ExecStart=/usr/bin/systemd-tmpfiles --create --remove

改成

ExecStart=/usr/bin/strace -f -tt -o /var/run/%N.strace /usr/bin/systemd-tmpfiles --create --remove

就是用 strace 这个调试工具把该服务运行时候进行的一些磁盘 I/O,子进程等写入到 /var/run/systemd-tmpfiles-setup.strace 这个文件。

重启。

打开 /var/run/systemd-tmpfiles-setup.strace 看,它有时间线数据的,你就知道卡在哪里了。然后相应优化即可。

可用于任何 systemd 服务。

注意:优化好后别忘了删除掉 /etc/systemd/system/systemd-tmpfiles-setup.service 这个我们复制出来的服务。

高手出手搭手撒手

首先感谢大神的热情回答,通过这个方法,获得以下日志 (/var/run/systemd-tmpfiles-setup.strace)

463   19:37:42.939174 getdents(4, /* 586 entries */, 32768) = 32752
463   19:41:39.007576 getdents(4, /* 585 entries */, 32768) = 32760

。Baidu,Google 无果,再次请教。。

贴 log 请只贴关键点,初步 examine log 是自己的事情。要不是我今天心情好… 你这帖就该沉了。

你这近 4 分钟只干了这一件事。所以你要去搜 getdents 是干嘛的。

总之在你不知道计算机干了什么之前,是没法优化的。

linux.die.net/man/2/getdents

getdents 是获取文件夹的。

举个例子,我的:

strace -f -tt -o strace.txt ls /home/marguerite/Documents/KDE

得到的 strace.txt 里面:

21124 21:47:35.935581 openat(AT_FDCWD, "/home/marguerite/Documents/KDE", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
21124 21:47:35.935662 getdents(3, /* 26 entries */, 32768) = 832
21124 21:47:35.935776 getdents(3, /* 0 entries */, 32768) = 0

getdents 的最上方的 openat 里的第二个参数告诉了它获取的文件夹是 “/home/marguerite/Documents/KDE”。

你的情况也是自己找到那个文件夹,问题就出在那个文件夹。

感谢你的耐心回答,根据你之前提供的方法,我找到 getdents(4, /* 586 entries */, 32768) = 32752 是在 /tmp 文件夹,后发现是由 NetBeans 的 BUG 产生了上万个 1kb 的 html 文件,于是清除,这个方法解决了使用 NetBeans 时而卡死的情况,可是重启测试后,发现依然存在开始很慢的情况,连续重启,查看日志,发现每次卡在的 getdents 参数都不一样,尝试查找目录无果,以下是几次的 log。

361   21:00:52.275875 getdents(4, /* 20 entries */, 32768) = 712
361   21:05:05.183179 getdents(4, /* 0 entries */, 32768) = 0

361   21:17:54.115250 getdents(4, /* 23 entries */, 32768) = 848
361   21:22:07.975494 getdents(4, /* 0 entries */, 32768) = 0

358   11:54:22.108266 getdents(4, /* 25 entries */, 32768) = 944
358   11:58:37.637261 getdents(4, /* 0 entries */, 32768) = 0

360   18:15:37.035178 getdents(4, /* 33 entries */, 32768) = 1272
360   18:19:52.569566 getdents(4, /* 0 entries */, 32768) = 0

疑问:

  1. 如何根据 getdents 参数查找目录?
  2. 每次的卡在的目录位置不一样,解决思路是什么?
  1. 你懂编程,我函数的 reference 都给你了。自己动手丰衣足食。log 里面中间那个参数是个 struct,里面有 inode。
    2 解决思路是头痛医头脚痛医脚。

但要是我的电脑,知道是 tmp 有问题我会去 yast sysconfig editor 设置开机时清理 tmp。或者用 tmpwatch 手动清理。

Sent from my Galaxy Note 2 using Tapatalk 4 Beta