jjzjj

c++ - 查找可能是由于线程锁定(可能)引起的性能问题

coder 2024-06-08 原文

我花了一些时间运行 valgrind/callgrind 来分析一个使用许多线程进行大量 TCP/IP 通信的服务器。在提高性能一段时间后,我意识到在这个特定的测试场景中,进程不受 CPU 限制,所以我看到的性能“改进”没有用。

理论上CPU应该很忙。我知道它连接的 TCP/IP 设备不是限制,因为服务器在两台机器上运行。一个是 PC,另一个是带有 Arm 处理器的嵌入式设备。即使是嵌入式设备也只有大约 2% 的 CPU 使用率,但它执行的事务要少得多——大约十分之一。尽管我们试图尽快获取数据,但两个系统最多只能获取大约 2%。

我的猜测是某个互斥锁被锁定并占用了一个线程。这是一个纯粹的猜测!系统中有几个线程具有公共(public)数据。也许还有其他可能性,但我怎么知道呢?

有没有办法使用像 valgrind/callgrind 这样的工具来显示系统调用所花费的时间?如果更好的话,我还可以使用 Visual Studio 2012 在 Windows 上运行它。

我们可能不得不尝试遍历代码或进行其他操作,但不确定是否有时间。

感谢任何提示。

谢谢。

最佳答案

Callgrind 是一个很棒的分析器,但它也有一些缺点。特别是,它假设相同的指令总是在相同的时间内执行,并且假设指令计数是最重要的指标。

这对于获得(大部分)可重现的分析结果和详 segmentation 析执行了哪些指令是很好的,但是 Callgrind 无法检测到某些类型的性能问题:

  • 等待锁的时间
  • sleep 时间(例如简单的 sleep()/usleep() 调用会有效地减慢您的应用程序,但不会显示在 Callgrind 中)
  • 等待磁盘 I/O 或网络 I/O 的时间
  • 等待数据被换出所花费的时间
  • CPU 缓存命中/未命中的影响(您可以尝试使用 Cachegrind 来解决这个特定主题)
  • 受 CPU 流水线停顿、分支预测失败以及现代 CPU 的所有其他特性的影响,这些特性可能会导致同一指令的执行速度更快或更慢,具体取决于上下文

使用 statistical 可以很好地检测到这些问题(或基于样本的)分析器。例如 SysprofOProfile ,或任何类型的“穷人抽样分析器”,如所描述的那样。在https://stackoverflow.com/a/378024 . WhozCraig 提到的 VS2012 内置分析器似乎也是一个采样分析器。

虽然统计分析器非常有用,因为它们提供“真实世界”的结果而不是简单的指令计数,但它们可能存在的缺点是您无法轻易获得可重现的结果(每次运行结果都会有所不同) ,并且您需要收集足够数量的样本才能获得详细的结果。

关于c++ - 查找可能是由于线程锁定(可能)引起的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24021967/

有关c++ - 查找可能是由于线程锁定(可能)引起的性能问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  7. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  8. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  9. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  10. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

随机推荐