热门标签 | 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等待锁内容请搜索<编程笔记>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<编程笔记>!


推荐阅读
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • CentOS系统安装与配置常见问题及解决方案
    本文详细介绍了在CentOS系统安装过程中遇到的常见问题及其解决方案,包括Vi编辑器的操作、图形界面的安装、网络连接故障排除等。通过本文,读者可以更好地理解和解决这些常见问题。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 本文深入探讨了 PHP 实现计划任务的方法,包括其原理、具体实现方式以及在不同操作系统中的应用。通过详细示例和代码片段,帮助开发者理解和掌握如何高效地设置和管理定时任务。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 本文介绍如何在Linux Mint系统上搭建Rust开发环境,包括安装IntelliJ IDEA、Rust工具链及必要的插件。通过详细步骤,帮助开发者快速上手。 ... [详细]
  • 脑机接口(BCI)技术正逐步将科幻变为现实,从帮助听障人士恢复听力到使瘫痪者重新站立,甚至可能将多年的学习过程压缩至瞬间。本文探讨了这一前沿技术的现状、挑战及其未来前景。 ... [详细]
  • This pull request introduces the ability to provide comprehensive paragraph configurations directly within the Create Note and Create Paragraph REST endpoints, reducing the need for additional configuration calls. ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
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社区 版权所有