热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C/C++开发者探讨Goland中的锁等待问题及其优化策略

问题描述:向后台发送了一个url请求,竟然一直卡住,没有返回,就一直卡着问题分析定位:一开始还以为是网络,还是什么其它奇怪的原因,毕竟之前好好的。这里应该第一时间思考环境的变化,网

问题描述:

向后台发送了一个url请求,竟然一直卡住,没有返回,就一直卡着

问题分析定位:

一开始还以为是网络,还是什么其它奇怪的原因,毕竟之前好好的。

这里应该第一时间思考环境的变化,网络、程序版本、还是什么地方变化了。

后来又试了好几次,发现还是一样,想到了将pod的数目改成了2个,于是估计是等待锁或者死锁之类的。

通过以下链接获取调试信息:
curl “127.0.0.1:43411/debug/pprof/goroutine?debug=1” > 1.out
curl “127.0.0.1:43411/debug/pprof/goroutine?debug=2” > 1.log

搜索卡住的请求方法名,果真搜到一些,goroutine 17002 [semacquire, 5 minutes]:表示17002这个goroutine正在等待获取锁,等了5分钟了。

又有一个正在运行中的同名方法,估计是大家都在等它的锁,看来代码,果然有一个锁。
但是这个goroutine调用栈最上层是setdatanodecarry,看到其方法内部,发现其也加了一个锁,不过其就是简单的对一个字段的变更进行加锁。
分析其使用的锁相关的代码,大家没有重叠,每一次加锁只不过是保证数据的原子性和一致性而已,所以不会有死锁的问题。

阅读setdatanodecarry附近的代码,有一个for availcarrycount selectednum {},之前没仔细看,这里竟然可能是一个死循环,分析了一下环境的变化,果然是因为环境不同了,导致这里的循环无法跳出。

总结

遇到此类问题首先不能慌,之后不能逃避问题。

需要将问题尽可能地记录,以便于还原,同时还要基于现在的情况进行调试,千万不能想着重启会好,不能逃避问题。

后面解决问题的步骤还可以,不过这个问题本身也不是很难。

————记录

  1 @ 0x47fc42 0x80fb0d 0x811270 0x80b86e 0x7ba758 0x7e0686 0x7f24fa 0x81d712 0x6ff9b4 0x7018b6 0x702c88 0x6fe971 0x469581  #0x47fc41 sync.(*rwmutex).unlock+0xb1     /usr/local/go/src/sync/rwmutex.go:113  #0x80fb0c [go文件路径]m.(*pod).setdatanodecarry+0x6c  /go/src/[go文件路径]m/t.go:777  #0x81126f [go文件路径]m.pts.ptsn+0x5f /go/src/[go文件路径]m/t.go:1059  #0x80b86d [go文件路径]m.(*t).ctcpd+0x83d /go/src/[go文件路径]m/t.go:453  #0x7ba757 [go文件路径]m.(*c).cdp+0x1e7  /go/src/[go文件路径]m/c.go:558  #0x7e0685 [go文件路径]m.(*m).cdp+0x375  /go/src/[go文件路径]m/handle_admin.go:353  #0x7f24f9 [go文件路径]m.(*m).servehttp+0x1659   /go/src/[go文件路径]m/http_server.go:188  #0x81d711 [go文件路径]m.(*m).handlerwithinterceptor.func1+0x81  /go/src/[go文件路径]m/http_server.go:160  #0x6ff9b3 net/http.handlerfunc.servehttp+0x43    /usr/local/go/src/net/http/server.go:1995  #0x7018b5 net/http.(*servemux).servehttp+0x1d5    /usr/local/go/src/net/http/server.go:2375  #0x702c87 net/http.serverhandler.servehttp+0xa7    /usr/local/go/src/net/http/server.go:2774  #0x6fe970 net/http.(*conn).serve+0x850     /usr/local/go/src/net/http/server.go:1878      2 @ 0x43c20f 0x44c609 0x44c5df 0x44c37d 0x47ecb9 0x7ba6ad 0x7e0686 0x7f24fa 0x81d712 0x6ff9b4 0x7018b6 0x702c88 0x6fe971 0x469581  #0x44c37c sync.runtime_semacquiremutex+0x3c   /usr/local/go/src/runtime/sema.go:71  #0x47ecb8 sync.(*mutex).lock+0x108    /usr/local/go/src/sync/mutex.go:134  #0x7ba6ac [go文件路径]m.(*c).cdp+0x13c /go/src/[go文件路径]m/c.go:554  #0x7e0685 [go文件路径]m.(*m).cdp+0x375 /go/src/[go文件路径]m/handle_admin.go:353  #0x7f24f9 [go文件路径]m.(*m).servehttp+0x1659  /go/src/[go文件路径]m/http_server.go:188  #0x81d711 [go文件路径]m.(*m).handlerwithinterceptor.func1+0x81 /go/src/[go文件路径]m/http_server.go:160  #0x6ff9b3 net/http.handlerfunc.servehttp+0x43   /usr/local/go/src/net/http/server.go:1995  #0x7018b5 net/http.(*servemux).servehttp+0x1d5   /usr/local/go/src/net/http/server.go:2375  #0x702c87 net/http.serverhandler.servehttp+0xa7   /usr/local/go/src/net/http/server.go:2774  #0x6fe970 net/http.(*conn).serve+0x850    /usr/local/go/src/net/http/server.go:1878

  goroutine 13994 [runnable]:  sync.(*mutex).lock(0xc002300468)  	/usr/local/go/src/sync/mutex.go:72 +0x2c9  sync.(*rwmutex).lock(0xc002300468)  	/usr/local/go/src/sync/rwmutex.go:93 +0x2d  [go文件路径]m.(*pod).setdatanodecarry(0xc0023003f0, 0x4024000000000000)  	/go/src/[go文件路径]m/t.go:774 +0x36  [go文件路径]m.pts.ptsn(0xc003b17810, 0x2, 0x2, 0x0, 0x3)  	/go/src/[go文件路径]m/t.go:1059 +0x60  [go文件路径]m.(*t).ctcpd(0xc0000ef090, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x6, 0xc002275958, ...)  	/go/src/[go文件路径]m/t.go:453 +0x83e  [go文件路径]m.(*c).cdp(0xc00223c000, 0xc00286e673, 0xe, 0xc00286e65f, 0x6, 0x0, 0x0, 0x0)  	/go/src/[go文件路径]m/c.go:558 +0x1e8  [go文件路径]m.(*m).cdp(0xc0009aca90, 0xabfd80, 0xc0031a1260, 0xc00296be00)  	/go/src/[go文件路径]m/handle_admin.go:353 +0x376  [go文件路径]m.(*m).servehttp(0xc0009aca90, 0xabfd80, 0xc0031a1260, 0xc00296be00)  	/go/src/[go文件路径]m/http_server.go:188 +0x165a  [go文件路径]m.(*m).handlerwithinterceptor.func1(0xabfd80, 0xc0031a1260, 0xc00296be00)  	/go/src/[go文件路径]m/http_server.go:160 +0x82  net/http.handlerfunc.servehttp(0xc000990300, 0xabfd80, 0xc0031a1260, 0xc00296be00)  	/usr/local/go/src/net/http/server.go:1995 +0x44  net/http.(*servemux).servehttp(0x10a3520, 0xabfd80, 0xc0031a1260, 0xc00296be00)  	/usr/local/go/src/net/http/server.go:2375 +0x1d6  net/http.serverhandler.servehttp(0xc0000dad00, 0xabfd80, 0xc0031a1260, 0xc00296be00)  	/usr/local/go/src/net/http/server.go:2774 +0xa8  net/http.(*conn).serve(0xc003b19860, 0xac1d80, 0xc0009a9e40)  	/usr/local/go/src/net/http/server.go:1878 +0x851  created by net/http.(*server).serve  	/usr/local/go/src/net/http/server.go:2884 +0x2f4      goroutine 17002 [semacquire, 5 minutes]:  sync.runtime_semacquiremutex(0xc0026fc460, 0x419400)  	/usr/local/go/src/runtime/sema.go:71 +0x3d  sync.(*mutex).lock(0xc0026fc45c)  	/usr/local/go/src/sync/mutex.go:134 +0x109  [go文件路径]m.(*c).cdp(0xc00223c000, 0xc00002a083, 0xe, 0xc00002a06f, 0x6, 0x0, 0x0, 0x0)  	/go/src/[go文件路径]m/c.go:554 +0x13d  [go文件路径]m.(*m).cdp(0xc0009aca90, 0xabfd80, 0xc0031a0620, 0xc002988900)  	/go/src/[go文件路径]m/handle_admin.go:353 +0x376  [go文件路径]m.(*m).servehttp(0xc0009aca90, 0xabfd80, 0xc0031a0620, 0xc002988900)  	/go/src/[go文件路径]m/http_server.go:188 +0x165a  [go文件路径]m.(*m).handlerwithinterceptor.func1(0xabfd80, 0xc0031a0620, 0xc002988900)  	/go/src/[go文件路径]m/http_server.go:160 +0x82  net/http.handlerfunc.servehttp(0xc000990300, 0xabfd80, 0xc0031a0620, 0xc002988900)  	/usr/local/go/src/net/http/server.go:1995 +0x44  net/http.(*servemux).servehttp(0x10a3520, 0xabfd80, 0xc0031a0620, 0xc002988900)  	/usr/local/go/src/net/http/server.go:2375 +0x1d6  net/http.serverhandler.servehttp(0xc0000dad00, 0xabfd80, 0xc0031a0620, 0xc002988900)  	/usr/local/go/src/net/http/server.go:2774 +0xa8  net/http.(*conn).serve(0xc003b18640, 0xac1d80, 0xc00298e940)  	/usr/local/go/src/net/http/server.go:1878 +0x851  created by net/http.(*server).serve  	/usr/local/go/src/net/http/server.go:2884 +0x2f4        goroutine 14532 [semacquire, 11 minutes]:  sync.runtime_semacquiremutex(0xc0026fc460, 0x419400)  	/usr/local/go/src/runtime/sema.go:71 +0x3d  sync.(*mutex).lock(0xc0026fc45c)  	/usr/local/go/src/sync/mutex.go:134 +0x109  [go文件路径]m.(*c).cdp(0xc00223c000, 0xc003f74303, 0xe, 0xc003f742ef, 0x6, 0x0, 0x0, 0x0)  	/go/src/[go文件路径]m/c.go:554 +0x13d  [go文件路径]m.(*m).cdp(0xc0009aca90, 0xabfd80, 0xc00454a620, 0xc004544800)  	/go/src/[go文件路径]m/handle_admin.go:353 +0x376  [go文件路径]m.(*m).servehttp(0xc0009aca90, 0xabfd80, 0xc00454a620, 0xc004544800)  	/go/src/[go文件路径]m/http_server.go:188 +0x165a  [go文件路径]m.(*m).handlerwithinterceptor.func1(0xabfd80, 0xc00454a620, 0xc004544800)  	/go/src/[go文件路径]m/http_server.go:160 +0x82  net/http.handlerfunc.servehttp(0xc000990300, 0xabfd80, 0xc00454a620, 0xc004544800)  	/usr/local/go/src/net/http/server.go:1995 +0x44  net/http.(*servemux).servehttp(0x10a3520, 0xabfd80, 0xc00454a620, 0xc004544800)  	/usr/local/go/src/net/http/server.go:2375 +0x1d6  net/http.serverhandler.servehttp(0xc0000dad00, 0xabfd80, 0xc00454a620, 0xc004544800)  	/usr/local/go/src/net/http/server.go:2774 +0xa8  net/http.(*conn).serve(0xc002e17540, 0xac1d80, 0xc002a74780)  	/usr/local/go/src/net/http/server.go:1878 +0x851  created by net/http.(*server).serve  	/usr/local/go/src/net/http/server.go:2884 +0x2f4

总结

到此这篇关于goland等待锁问题的文章就介绍到这了,更多相关goland等待锁内容请搜索<编程笔记>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<编程笔记>!


推荐阅读
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • 本文介绍了如何在两个Oracle数据库(假设为数据库A和数据库B)之间设置DBLink,以便能够从数据库A中直接访问和操作数据库B中的数据。文章详细描述了创建DBLink前的必要准备步骤以及具体的创建方法。 ... [详细]
  • CentOS下ProFTPD的安装与配置指南
    本文详细介绍在CentOS操作系统上安装和配置ProFTPD服务的方法,包括基本配置、安全设置及高级功能的启用。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 如何在Mozilla Firefox中调整GIF动画的循环次数
    本文介绍了如何通过调整Mozilla Firefox的高级设置来控制GIF动画的播放次数,帮助用户根据个人喜好自定义浏览体验。 ... [详细]
  • 探讨低代码行业发展现状,分析其未能催生大型企业的原因,包括市场需求、技术局限及商业模型等方面。 ... [详细]
  • 本文旨在探讨设计模式在Visual FoxPro (VFP) 中的应用可能性。虽然VFP作为一种支持面向对象编程(xbase语言)的工具,其OO特性相对简明,缺乏高级语言如Java、C++等提供的复杂特性,但设计模式作为一种通用的解决方案框架,是否能有效应用于VFP,值得深入研究。 ... [详细]
  • JavaScript 实现图片文件转Base64编码的方法
    本文详细介绍了如何使用JavaScript将用户通过文件输入控件选择的图片文件转换为Base64编码字符串,适用于Web前端开发中图片上传前的预处理。 ... [详细]
  • 探讨了在VB中使用WebBrowser控件时遇到的‘无法找到或打开C:\WINDOWS\system32\ieframe.dll’问题,并提供了解决方案。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
  • c#  项目文件,C#viual studio使用方法
    一、项目文件1)Properties节点下主要存放的是当前程序集相关的信息,如版本号、标题等。双击”Properties“,打开如下项目属 ... [详细]
author-avatar
北冥其名
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有