使用killall cfprefsd刷新首选项缓存会导致OS X 10.9.5上的唤醒过多

时间:2015-03-14 05:59:42

标签: osx-mavericks launchd wakeup cfpreferences

我在网上的搜索显示终止信号触发cfprefsd守护进程重新读取所有plist文件。 see here

当执行killall cfprefsd时,系统会冻结(显示可怕的沙滩球),直到它完全重启守护进程(我的系统可能需要1-5分钟)。在另一台Macbook(运行10.9.4)上,我在运行sudo killall cfprefsd时没有发现此问题。

这是我在日志中找到的。什么可以导致过度唤醒的想法?我在哪里找到引起这个问题的问题?

13-3-'15 11:30:36.063 AM sudo[54484]:     root : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/killall cfprefsd
13-3-'15 11:31:28.000 AM kernel[0]: process who[54487] caught causing excessive wakeups. Observed wakeups rate (per sec): 864; Maximum permitted wakeups rate (per sec): 150; Observation period: 300 seconds; Task lifetime number of wakeups: 45001
13-3-'15 11:31:28.000 AM kernel[0]: process cfprefsd[54488] caught causing excessive wakeups. Observed wakeups rate (per sec): 864; Maximum permitted wakeups rate (per sec): 150; Observation period: 300 seconds; Task lifetime number of wakeups: 45001
13-3-'15 11:31:28.000 AM kernel[0]: process cfprefsd[54489] caught causing excessive wakeups. Observed wakeups rate (per sec): 864; Maximum permitted wakeups rate (per sec): 150; Observation period: 300 seconds; Task lifetime number of wakeups: 45001

PS我怀疑一个或多个plist可能已损坏。我如何找出哪个?

2015年3月15日更新:

我使用kill -15 <pid>运行了几次cfprefsd重启(我有2:root和我自己)。虽然在过去两者似乎都被过度唤醒(同时终止)所困扰,但在我的测试中它似乎只适用于root用户。所以我可以比较来自fs_usage的记录中的时间戳:

系统冻结时

13:33:00.015    exit                                                    0.000054    cfprefsd.2656406
13:33:05.007    open    F=17    (R_____)/usr/sbin/cfprefsd                              0.000035    appProtd.1953
13:33:56.982    posix_spawn     /usr/sbin/cfprefsd                                                        5 1.9758   W  launchd.2656433
13:34:48.866    stat64          /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation   0.000012    cfprefsd.2656433

没有任何冻结:

13:35:30.124    exit                                                    0.000076    cfprefsd.2656806
13:35:31.790    open    F=17    (R_____)/usr/sbin/cfprefsd                              0.000029    appProtd.1953               
13:35:31.791    posix_spawn     /usr/sbin/cfprefsd                              0.000728 W  launchd.2657306
13:35:31.791    stat64          /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation   0.000014    cfprefsd.2657306

看起来launchd及时创建新cfprefsd进程并启动进程存在问题,因为在此时间间隔内系统冻结(注意CPU在此间隔期间几乎空闲)

2 个答案:

答案 0 :(得分:2)

我不知道答案,但我可以提出几个问题排查建议:

  • 不要担心“过度唤醒”的消息; AIUI只表明该进程使用的内核服务比“通常”更多,并不一定表示实际问题(12)。
  • 不要一次杀死所有cfprefd进程,而是尝试一次一个地杀死它们,看看哪一个导致挂起。您可以使用ps -ax -Ouser | grep [c]fprefsd获取cfprefsd进程列表,然后使用sudo kill <PID>按进程ID终止它们。
  • 当您重新启动cfprefsd进程时,请使用sudo fs_usage | grep cfprefsd来查看他们正在访问的文件。寻找在挂起之前,期间或之后访问的文件,尽可能怀疑。
  • 您可以使用plutil -lint检查.plist文件的格式完整性(例如sudo plutil -lint /Library/Preferences/*.plist)。请注意,这仅检查属性列表格式的完整性,而不是存储在属性列表中的信息。此外,cfprefsd通常会修复(/丢弃和替换)损坏的文件本身,所以我怀疑这会变成什么。
  • 检查.plist文件的权限,标志等,例如ls -leO@ /Library/Preferences。例如,如果其中一个文件被锁定(“uchg”标志),或者您的一个用户偏好设置由另一个用户拥有,则可能会导致奇怪的效果。
  • 您可以尝试删除可能存在问题的文件,例如:将它们移动到桌面(我首先备份整个相关的Preferences文件夹!),看看它有什么效果。完成此操作后,请恢复“首选项”文件夹的后面,这样就不会忘记还原任何您搞过的文件。

答案 1 :(得分:0)

事实证明,我正在运行适用于优胜美地的McAfee VirusScan版本9.7.0。在降级到版本9.6.0之后,观察到的刷新cfprefsd的问题消失了。