[关闭]
@zhouyy 2018-03-16T06:50:49.000000Z 字数 1213 阅读 1943

CPU 出现soft lockup的解决办法

linux


soft lockup, 软中断 , 内核中有进程进入了死循环,结束不了,或执行时间过长。
原因1:死循环
原因2:死锁

死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进程本身是解决不了的,需要外在的推动,才能解决,最重要的是死锁不仅仅影响进程业务,而且还会占用系统资源,影响其他进程。所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题。

官方2.6.32内核,相关函数是softlockup_tick(),这个函数在时钟中断的处理函数run_local_timers()中调用。
- 这个函数会首先检查watchdog线程是否被挂起,如果不是watchdog线程,会检查当前占有CPU的线程占有的时间是否超过系统配置的阈值,即softlockup_thresh。如果当前占有CPU的时间过长,则会在系统日志中输出我们上面看到的那条日志。

  1. if (now <= (touch_timestamp + softlockup_thresh))return;
  2. per_cpu(print_timestamp, this_cpu) = touch_timestamp;
  3. spin_lock(&print_lock);
  4. printk(KERN_ERR BUG: soft lockup - CPU#%d stuck for %lus! [%s:%d]\n,
  5. this_cpu, now - touch_timestamp,
  6. current-comm, task_pid_nr(current));
  1. print_modules();
  2. print_irqtrace_events(current);if (regs)show_regs(regs);elsedump_stack();
  3. spin_unlock(&print_lock);
  4. if (softlockup_panic)
  5. panic(softlockup: hung tasks);}

服务器跑大量高负载程序,造成cpu soft lockup。如果确认不是软件的问题。采用下面的解决办法。

  1. #softlockup_panic的值默认竟然是0,所以在出现死锁或者死循环的时候,会一直只输出日志信息,而不会宕机
  2. cat /proc/sys/kernel/hung_task_panic
  3. 0
  4. #修改为1
  5. echo 1> /proc/sys/kernel/hung_task_panic
  6. #修改超时阈值
  7. echo 30 > /proc/sys/kernel/watchdog_thresh //centos
  8. #如果标准内核 /proc/sys/kernel/softlockup_thresh
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注