[kipmi0]进程CPU占用率高

简介:

TOP发现系统负载整体很低,但CPU2的sys占用率很高在90%以上,查看当前正在运行的进程发现kipmi0进程占用率达到100%。

IPMI的初步认识:
IPMI是智能型平台管理接口(Intelligent Platform. Management Interface)的缩写,是管理基于Intel结构的企业系统中所使用的外围设备采用的一种工业标准,
该标准由英特尔/惠普/NEC/美国戴尔电脑和SuperMicro等公司制定。用户可以利用IPMI监视服务器的物理健康特征,如温度/电压/风扇工作状态、电源状态等。而且
更为重要的是IPMI是一个开放的免费标准,用户无需为使用该标准而支付额外的费用。
自1998 年,IPMI论坛创建了IPMI标准依赖,其已经得到了170 多家供应商的支持,使得其逐渐成为了一个完整地包括服务器和其他系统(如存储设备、网络和通信设备)的硬件管理规范,目前该标准最新版本为IPMI 2.0,该版本在原有基础上有了不少的改进,包括可以通过串口、Modem以及Lan等远程环境管理服务器系统(包括远程开关机),以及在安全、VLAN 和刀片支持等方面的提高。IPMI针对大量监 控、控制和自动回复服务器的作业,提供了智能型的管理方式。此标准适用于不同的服务器拓朴学,以及Windows、Linux、 Solaris、Mac或是混合型的操作系统。此外,由于IPMI可在不同的属性值下运作,即使服务器本身的运作不正常,或是由于任何原因而无法提供服 务,IPMI仍可正常运作。

查看IPMI相关的内核源码,发现09年提出的一个Patch(目前已合入主干,并做了再次修改):

  1. [PATCH] limit CPU time spent in kipmid (version 4)



  2. Signed-off-by: martin.wilck@xxxxxxxxxxxxxx

  3. --- linux-2.6.29.4/drivers/char/ipmi/ipmi_si_intf.c    2009-05-19 01:52:34.000000000 +0200

  4. +++ linux-2.6.29-rc8/drivers/char/ipmi/ipmi_si_intf.c    2009-06-04 15:30:34.855398091 +0200

  5. @@ -297,+297,9 @@

  6. static int force_kipmid[SI_MAX_PARMS];

  7. static int num_force_kipmid;


  8. +static unsigned int kipmid_max_busy_us[SI_MAX_PARMS];

  9. +static int num_max_busy_us;

  10. +

  11. static int unload_when_empty = 1;


  12. static int try_smi_init(struct smi_info *smi);

  13. @@ -927,23 +930,56 @@

  14. }

  15. }


  16. +#define ipmi_si_set_not_busy(timespec) \

  17. +    do { (timespec)->tv_nsec = -1; } while (0)

  18. +#define ipmi_si_is_busy(timespec) ((timespec)->tv_nsec != -1)

  19. +

  20. +static int ipmi_thread_busy_wait(enum si_sm_result smi_result,

  21. +    const struct smi_info *smi_info,

  22. +    struct timespec *busy_until)

  23. +{

  24. +    unsigned int max_busy_us = 0;

  25. +

  26. +    if (smi_info->intf_num < num_max_busy_us)

  27. +    max_busy_us = kipmid_max_busy_us[smi_info->intf_num];

  28. +    if (max_busy_us == 0 || smi_result != SI_SM_CALL_WITH_DELAY)

  29. +    ipmi_si_set_not_busy(busy_until);

  30. +    else if (!ipmi_si_is_busy(busy_until)) {

  31. +    getnstimeofday(busy_until);

  32. +    timespec_add_ns(busy_until, max_busy_us*NSEC_PER_USEC);

  33. +    } else {

  34. +    struct timespec now;

  35. +    getnstimeofday(&now);

  36. +    if (unlikely(timespec_compare(&now, busy_until) > 0)) {

  37. +    ipmi_si_set_not_busy(busy_until);

  38. +    return 0;

  39. +    }

  40. +    }

  41. +    return 1;

  42. +}

  43. +

  44. static int ipmi_thread(void *data)

  45. {

  46. struct smi_info *smi_info = data;

  47. unsigned long flags;

  48. enum si_sm_result smi_result;

  49. +    struct timespec busy_until;


  50. +    ipmi_si_set_not_busy(&busy_until);

  51. set_user_nice(current, 19);

  52. while (!kthread_should_stop()) {

  53. +    int busy_wait;

  54. spin_lock_irqsave(&(smi_info->si_lock), flags);

  55. smi_result = smi_event_handler(smi_info, 0);

  56. spin_unlock_irqrestore(&(smi_info->si_lock), flags);

  57. +    busy_wait = ipmi_thread_busy_wait(smi_result, smi_info,

  58. +    &busy_until);

  59. if (smi_result == SI_SM_CALL_WITHOUT_DELAY)

  60. ; /* do nothing */

  61. -    else if (smi_result == SI_SM_CALL_WITH_DELAY)

  62. +    else if (smi_result == SI_SM_CALL_WITH_DELAY && busy_wait)

  63. schedule();

  64. else

  65. -    schedule_timeout_interruptible(1);

  66. +    schedule_timeout_interruptible(0);

  67. }

  68. return 0;

  69. }

  70. @@ -1213,+1249,11 @@

  71. MODULE_PARM_DESC(unload_when_empty, "Unload the module if no interfaces are"

  72. " specified or found, default is 1. Setting to 0"

  73. " is useful for hot add of devices using hotmod.");

  74. +module_param_array(kipmid_max_busy_us, uint, &num_max_busy_us, 0644);

  75. +MODULE_PARM_DESC(kipmid_max_busy_us,

  76. +    "Max time (in microseconds) to busy-wait for IPMI data before"

  77. +    " sleeping. 0 (default) means to wait forever. Set to 100-500"

  78. +    " if kipmid is using up a lot of CPU time.");

通过Patch的说明以及Patch中最后的参数介绍:当kipmid占用较多CPU时,可以将kipmid_max_busy_us设置100-500。
邮件原文如下,是为了降低kipmid的开销

  1. Hi all,


  2. I am sorry for the long silence. I am sending here a new version of my patch which takes into account Bela's suggestions (well, most of them).

  3. I compiled and tested it with 2.6.29.4, the results are similar as before. By setting kipmid_max_busy_us to a value between 100 and 500, it is possible to bring down kipmid CPU load to practically 0 without loosing too much ipmi throughput performance.


  4. Please give me some feedback whether this patch will get merged, and if not, what improvement is needed.


  5. Regards

  6. Martin

Kipmid的开销与其实现有关,暂时不深入究,不过可以通过Patch看到通过设置kipmid_max_busy_us来影响kipmid的调度策略,进而降低CPU的占用率。
看一下网上对ipmi占用CPU问题的说明:

Fix:不需要修复
No fix required. You should ignore increased CPU utilization as it has no impact on actual system performance.
利用空余的CPU资源进行一些接口自动调节的任务。

临时降低(立即生效,cpu占用率降到10%以内):

echo 100 > /sys/module/ipmi_si/parameters/kipmid_max_busy_us

永久性降低(修改配置文件,模块/系统重启生效)

To make the changes persistent you can configure the options for the ipmi_si kernel module.
Create a file in /etc/modprobe.d/, i.e./etc/modprobe.d/ipmi.conf, and add the following content:
# Prevent kipmi0 from consuming 100% CPU

echo "options ipmi_si kipmid_max_busy_us=100">/etc/modprobe.d/ipmi.conf





      本文转自独弹古调  51CTO博客,原文链接:

http://blog.51cto.com/hunkz/1653806

,如需转载请自行联系原作者




相关文章
|
14天前
|
Java 对象存储 开发者
如何找出Java进程占用CPU高的元凶
本文记录了一次Java进程CPU占用率过高的问题和排查思路。
|
28天前
|
Windows
dllhost.exe进程占用CPU很高怎么解决?
全面解析dllhost.exe进程
65 16
|
1月前
|
缓存 监控 负载均衡
CPU占用率爆表:高效诊断与解决策略
面对CPU占用率飙升至100%的情况,系统管理员和开发人员需要迅速采取行动以避免性能瓶颈和系统崩溃。本文将提供一系列诊断和解决CPU占用过高问题的实用方法。
54 4
|
1月前
|
监控 负载均衡 算法
CPU占用率爆表:高效诊断与解决CPU 100%问题
在系统运维和软件开发中,CPU占用率达到100%是一个常见的性能瓶颈问题。这种情况可能会导致系统响应缓慢,甚至崩溃。本文将分享如何高效诊断和解决CPU占用率过高的问题,帮助你快速定位并解决问题。
110 5
|
2月前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
157 0
Java面试题之cpu占用率100%,进行定位和解决
|
4月前
|
小程序 JavaScript Java
【Java】服务CPU占用率100%,教你用jstack排查定位
本文详细讲解如何使用jstack排查定位CPU高占用问题。首先介绍jstack的基本概念:它是诊断Java应用程序线程问题的工具,能生成线程堆栈快照,帮助找出程序中的瓶颈。接着,文章通过具体步骤演示如何使用`top`命令找到高CPU占用的Java进程及线程,再结合`jstack`命令获取堆栈信息并进行分析,最终定位问题代码。
427 1
【Java】服务CPU占用率100%,教你用jstack排查定位
|
3月前
|
存储 监控
【Azure Cloud Service】在Azure云服务中收集CPU监控指标和IIS进程的DUMP方法
在使用Cloud Service服务时,发现服务的CPU占用很高,在业务请求并不大的情况下,需要直到到底是什么进程占用了大量的CPU资源,已经如何获取IIS进程(w3wp.exe)的DUMP文件?
|
4月前
|
Linux Python
在Linux中,如何查找系统中占用CPU最高的进程?
在Linux中,如何查找系统中占用CPU最高的进程?
|
4月前
|
Linux
在Linux中,如何查看占用CPU最多的进程?
在Linux中,如何查看占用CPU最多的进程?
|
4月前
|
缓存 Linux 调度
Linux服务器如何查看CPU占用率、内存占用、带宽占用
Linux服务器如何查看CPU占用率、内存占用、带宽占用
1167 0