__lll_lock_wait_private错误

一个DBA同事昨天在执行一个命令行工具的时候发现程序hang住,问题挺有意思,值得记录下。

首先用pstack看了下程序的调用栈,这是个多线程程序,pstack结果看到几乎所有的线程都等在write调用上。如下是pt-pmp的输出结果:

Tue May 27 18:30:06 CST 2014

55 __lll_lock_wait_private,_L_lock_51,fwrite,LoadConsumer::run,CThread::hook,start_thread,clone

1 write,_IO_new_file_write,_IO_new_file_xsputn,buffered_vfprintf,vfprintf,fprintf,LoadManager::dump,LoadProducer::load_file,LoadProducer::run,CThread::hook,start_thread,clone

直觉上觉得是磁盘空间满了,让他看了下,磁盘空间还很富裕,touch创建文件也没任何问题,当时此机器上还在跑一个备份程序,IO压力不小,不过和问题本身应该关系不大。Google了下__lll_lock_wait_private这个错误,也没任何有用的信息。这个工具程序本身会向一个命令行指定的日志文件输出很多程序执行结果,同时会向stderr输出程序的执行状态,gdb attach看了下程序具体的调用栈,发现程序都阻塞在fprintf(stderr)上。咨询了下同事,他使用这个工具是通过一个python脚本调用的,调用的程序类似如下:

p = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,close_fds=True)

cmd是调用程序的命令行,包括一系列选项。问题看起来很清晰了,通过python调用此命令行工具时,stdout和stderr都被重定向了subprocess.PIPE,但没有程序从此PIPE读取,那么很快这个PIPE自身的buffer都写满了,pstack看到的结果就是所有write都阻塞。  

写了个小程序重现了下,程序如下(随手写的..): 

1 #include <stdio.h>  2 #include <pthread.h>  3 #include <unistd.h>  4 void *thr_fn(void *arg)  5 {  6   int i =0;  7   while(true)  8   {  9     i++; 10     fprintf(stderr, "helloworld %d\t\t\t\t",i); 11     fprintf(stdout, "kkkkkkkkkk %d\t\t\t\t",i); 12     sleep(1); 13   } 14 } 15 16 int main(void) 17 { 18   for (int i = 0; i!= 50; i++) 19   { 20     pthread_t tid; 21     pthread_create(&tid, NULL, thr_fn, NULL); 22   } 23 24   sleep(100000); 25 }

调用的python脚本如下:

import subprocess
import os
import time
  5 ret = {}
  7 cmd = "./a.out >/tmp/log"
  9 p = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,close_fds=True)
 11 ret['status'] = p.wait()
ret['msg'] = p.stdout.readlines()
 14 time.sleep(100000000);

执行此python脚本,会发现很快a.out就被hang住了,表现是/tmp/log不再有新的输出,程序调用栈如下:

49 __lll_lock_wait_private,_L_lock_12956,buffered_vfprintf,vfprintf,fprintf,thr_fn,start_thread,clone

1 write,_IO_new_file_write,_IO_new_file_xsputn,buffered_vfprintf,vfprintf,fprintf,thr_fn,start_thread,clone

1 nanosleep,sleep,main  

解决此问题,1)maybe subprocess.Popen这个程序参数可以改改?2)或者在cmd里边将stdout/stderr都重定向掉;3)写命令行程序的时候要注意,调用的脚本各种写法都可能有,因此写日志尽量还是要规范,不要向stdout/stderr输出过多的东西。  

组里开发的同事补充了下MySQL遇到__lll_lock_wait_private 错误的常见场景:

"这个函数调用在mysql上最典型的场景就是开启cgroup时会经常碰到这个,例如memcpy, mem alloc, free , mutext lock/unlock...."

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/extra/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索程序
, pthread 命令行
, fprintf
, 输出
, stdout
, lll
, subprocess
stderr
llllockwaitprivate、lll lock wait、lock wait private、lll futex wait、futex wait private,以便于您获取更多的相关知识。

时间: 2024-10-18 05:48:25

__lll_lock_wait_private错误的相关文章

“无法创建网站,未指定的错误”错误的解决方法

在Win7系统中使用IE浏览器时,通常情况下都会将自己喜欢的网页添加到收藏夹,也是便后继快捷打开使用.然而在用户打开网页,点击"添加到收藏夹"按钮时,系统却突然弹出了一个"无法创建网站,未指定的错误"的提示窗口.这种状况是由于转移了收藏夹位置,收藏夹对新的文件夹没有完全控制的权限,从而导致添加网址失败的问题,出现收藏夹项目无法查看和刷新的情况,怎么办呢?小编以雨林木风win7旗舰版64位系统为例给大家分享IE无法添加网址到收藏夹简单的解决方案,具体如下: 1.在Wi

解决win7系统唤醒休眠状态出现“拒绝访问”错误的方法

  windows休眠状态是指将所有运行的实时数据存储到硬盘上,并且关闭一切不必要的硬件从而节省电量,无论你所使用的windows是哪个版本,系统都能够让用户自动进入休眠状态,当然在你没有关闭休眠功能的前提下,不过在近期有部分win7用户反映,将系统从休眠状态唤醒时,出现"拒绝访问"的错误,对于该问题我们如何解决呢?下面看为您带来的解决方法! 解决win7系统唤醒休眠状态出现"拒绝访问"错误的方法 第一步.进入Win7系统后,我们在键盘中按"Win+R&q

Win8出现“wermgr.exe - Application Error”的错误

  故障现象: 无法打开EXE文件或程序,wermgr.exe应用程序错误,应用程序错误0x801d8ed0指令引用的0x801d8ed0该内存不能为write 解决方案: 发现原来是"搜狗拼音输入法"导致的,即如果在系统中使用"搜狗拼音输入法"时打开程序软件就会产生"wermgr.exe"的错误(甚至在更改权限的时候也遭到出错).解决方法就是将输入法更改为"ENG"或是"微软拼音输入法"就可以解决问题了.

6大PS里最常见的讨厌错误

  润饰照片是一个专门的学问,所谓最强的PS技术其实就是看不出有PS过.然而在把软件运用自如前,很多人在修图时可能都会犯下一些错误.摄影师Ryan Cooper就写了一篇文章,指出他常常见到的六种PS错误. 以下有一些比较极端的示范例子,让大家能够明显看到差别: 1.恶魔之眼 修图的对象是人类对吧?那就不要把眼白都PS 得像怪物一样发光.记住眼白不是永远也是白色的,如果修图时想把眼睛调亮一点,试试在调光后把图层的透明度变成50%,人的眼睛晴就会自然多了. 2.莫名奇妙的耀光 在制作一个假的耀光前

vs2012-求问,&amp;amp;quot;lnk1158 无法运行rc.exe&amp;amp;quot;错误怎么解决?

问题描述 求问,"lnk1158 无法运行rc.exe"错误怎么解决? 我用的VS2012,一直用的好好地,但是今天突然在编译x64程序的时候出现"lnk1158 无法运行rc.exe"错误.相同的win32程序则未出现此错误. 重装编译器和windows sdk之后无法解决,windows sdk路径应该正确.求问有没有什么解决方法. 解决方案 重装VS2012,看来是被SDK影响了rc.exe工具. 解决方案二: 或者卸掉SDK,直接用VS2012自带的rc.e

动易系统九个常见的错误原因分析及解决方法

错误|解决 错误提示:ADODB.Recordset 错误 '800a0cc1'Item cannot be found in the collection corresponding to the requested name or ordinal./index.asp,行15 错误原因:服务器上安装动易组件最新组件,但网站系统是用的4.0,系统没有找到相应的字段.动易组件从4.02开始向下兼容,但不兼容4.0.解决方法:请在升级网站系统至最新版本. =====================

asp连接access错误:Microsoft JET Database Engine (0x80004005) 未指定的错误

在一次配置网站空间的过程中,把一个调试好的程序上传到服务器,出现连接数据库错误:Microsoft JET Database Engine (0x80004005) 未指定的错误 出现错误后,百般调试不得其解.先后给ACCESS数据库目录所有权限,数据库文件修复压缩等等方法,问题依然出现,后来翻阅一些资料后,找到解决方法! 连接ACCESS数据库错误 错误类型:Microsoft JET Database Engine (0x80004005) 未指定的错误 原因:在服务器安全配置中,没有开放I

IIS6.0 ASP 错误解析

iis|错误|iis 事 件ID 描 述0100内存不足.无法分配所需的内存. 0101意外错误.函数返回.0102要求字符串输入.函数需要字符串输入.0103要求数字输入.函数需要数字输入.0104不允许操作.0105索引超出范围.数组索引超出范围.0106类型不匹配.遇到未处理的数据类型.0107数据大小太大.请求中发送的数据大小超出允许的限制.0108创建对象失败.创建对象 '%s' 时出错.0109成员未找到.0110未知的名称.0111未知的界面.0112参数丢失.0113脚本超时.超

计算机改名引发的ORA-12541: TNS无监听程序错误

 近期上班时,由于开机时老是提示" 局域网出现计算机重名冲突",于是把计算机名字给改了,从PC2010081312zeo改为了CXBIKKKKKKK,结果第二天来的时候,用 PL/SQL连接我本地机子的ORACLE实例时,弹出ORA-12541:TNS无监听程序错误的提示,当时也没想到是计算机改名引起的问题,以为是相 关服务没有启动缘故,于是我打开服务面板,如图所示,发现 OracleOraDb10g_home1TNSListener服务没有启动,于是启动这个服务,结果等我启动后,出现