Articles of 性能

在Linux上,access()比stat()更快吗?

我假设access()只是stat()的一个包装,但是我一直在用googlesearch, 发现了一些关于用更便宜的访问调用取代stat调用的轶事 。 假设你只是想检查一个文件是否存在,访问速度更快? 它是完全不同的文件系统?

什么是“高度非自愿的背景”开关意味着什么?

我用 C语言重写了一部分代码。使用getrusage(2) C APItesting资源使用情况。 在更改代码之前: user time (ms): 21503 system time (ms): 372 involuntary context switches: 20 改变之后: user time (ms): 25589 system time (ms): 80732 involuntary context switches: 821 我看到很多involuntary context switches都是在我重写的代码中完成的。 我的问题不是关于如何减less上下文切换。 但.. 当“非自愿的上下文切换”更多时会发生什么? 它会以什么方式影响系统? PS:没有任何东西正在写入磁盘上没有活动。 它只是多次ping服务器。 更新: 增加了系统和用户的时间。 程序是multithreading的。 两种情况下都会产生相同数量的线程(3k线程)。 只有C中的底层API正在被重写。

当perf stat没有提供线索时,我怎样才能解释一个较慢的执行?

我的程序测量执行500次函数所需的时间(这个时间约为14秒),并报告每次执行的平均时间。 由于精确的时间测量很重要,所以我非常小心地去除时间测量中所有可能的噪音源。 该程序在Ubuntu 14.04下运行,具有root权限, nice -n -20 ,在屏蔽的CPU上(使用-k on选项来cset shield )。 超线程被禁用。 内存只被分配一次,以避免由于malloc导致的上下文切换。 在计时开始之前执行一个大的memset和500预热function执行,试图在定时器启动之前获得类似的数据高速caching状态。 该程序是相当小的,所以我不担心指令caching。 时间是以clock_gettime(CLOCK_MONOTONIC)返回的两个值的差值来clock_gettime(CLOCK_MONOTONIC) 。 下面是从连续5次运行的报告时间(以毫秒为单位,但是测量的时间是这次的500次,所以它是大约14秒): 28.77 。 请注意,这里有三个非常一致的时序结果(#1,#3和#4)。 我正在寻求帮助来理解和消除exception值的来源。 以下是第一次和最后一次运行的性能perf stat报告: 第一次运行: 29176.113027 task-clock (msec) # 0.999 CPUs utilized 596 context-switches # 0.020 K/sec 0 cpu-migrations # 0.000 K/sec 5,061 page-faults # 0.173 K/sec 104,825,303,791 cycles # 3.593 GHz <not supported> stalled-cycles-frontend […]

是否有可能在某个二进制文件中使用vtune而不是整个二进制文件?

我正在将一个小型库的使用添加到一个现有的大型软件中,并且想要分析(在查找程序中的细节,而不仅仅是在rdtsc()或gettimeofday调用中)的开销和小型库的归属。 使用诸如rdtsc()之类的东西我可以感觉到调用我的库函数的延迟,但是我不能做延迟归因,除非我也能够看到分支是否被预测得不好,caching工作不正常等。我考虑PAPI是因为我想像在一个更大的二进制文件中查看某些硬件事件进入和退出我的库的例程,但似乎我需要一个特定的内核模块来为我工作(Linux 2.6。 18 && Intel Xeon 5570)… Vtune专门针对英特尔处理器,但它好像是用来分析性能的整个二进制文件,而不是特定的代码片段(3-4个调用到我的库中)。 有没有办法让我使用Vtune来实现我的目标,或者可能让我能够访问这样的计数器,而无需修补我的内核?

防止gtk FileChooserDialog调用目录中的所有文件的统计信息?

打开一个gtk FileChooserDialog对包含很多文件的nfs目录来说太痛苦了。 strace显示了很多时间调用“stat”。 目录中每个文件约5个呼叫。 我们怎样才能关掉“统计”的电话,只显示文件名列表没有修改时间? 我们使用Redhat企业版4,x86_64,Linux 2.6.9-42.0.8.ELsmp和FileChooser来自:/usr/lib64/libgtk-x11-2.0.so.0.400.13。 一个testing程序将打开一个FileChooserDialog并且需要10秒钟的时间才能显示出来,而'ls'列出同一个目录需要25ms。 我们的eclipse应用程序正在被这个文件select器问题摧毁…

如何强制两个进程在同一个CPU上运行?

语境: 我正在编写一个由多个进程组成的软件系统。 它在Linux下用C ++编程。 他们之间使用Linux共享内存进行通信。 通常情况下,在软件开发中,处于性能优化的最后阶段。 在这里,我遇到了一个大问题。 该软件对性能有很高的要求,但在有4个或8个CPU核心的机器上(通常有多个CPU),只能使用3个核心,从而浪费了25%的CPU功率,其次是60%。 经过多次研究,抛弃了互斥和锁争用,我发现时间被shmdt / shmat调用浪费了(分离并附加到共享内存段)。 经过更多的研究,我发现这些通常是AMD Opteron和Intel Xeon的CPU使用了一个名为NUMA的内存系统,这基本上意味着每个处理器都有其快速的“本地内存”,并且从其他CPU访问内存是昂贵。 做了一些testing之后,问题似乎就是这样devise软件,基本上,任何进程都可以将共享内存段传递给任何其他进程,并传递给其中的任何线程。 这似乎杀死了性能,因为进程不断地从其他进程访问内存。 题: 现在的问题是,有没有办法强制在同一个CPU中执行一对进程? 我并不是说要强迫他们总是在同一个处理器上执行,因为我不在乎他们是在哪一个执行的,尽pipe这样做会完成这个任务。 理想情况下,有一种方法可以告诉内核:如果你在一个处理器中调度这个进程,你还必须在同一个处理器中调度这个“兄弟”进程(它是通过共享内存进行通信的进程),这样performance不受惩罚。

寻找一种准确的方法来微观testing用C ++编写的并在Linux / OSX上运行的小代码path

我正在寻找一些非常基本的微型基准testing,例如我用C ++编写的小型代码path,比如紧密循环。 我在Linux和OSX上运行,并使用GCC。 什么设施有亚毫秒的精度? 我正在考虑多次运行代码path的简单testing(几千万?)会给我足够的一致性,以获得良好的阅读。 如果有人知道更好的方法,请随时提出build议。

用于Linux的开源OpenGL剖析器

标题总结了我的问题很好:是否有Linux的开源 OpenGL分析器? 我唯一能find的就是gDEBugger ,但它只有7天的试用期,而且是非常封闭的源代码。 我会免费(如在自由)软件开发,所以付款是不是一种select,虽然我可能会考虑接受免费(如啤酒)的答案,但封闭的应用程序。 奖金点,如果它与开源驱动程序(我的主电脑有一个集成的英特尔graphics卡)的作品。

如何自动更新Docker实例之间共享的计数器

我有一个简单的C ++服务(API端点),每调用一次API就增加一个计数器。 当调用者将数据发送到http://10.0.0.1/add时 ,计数器必须加1,并将计数器的值返回给调用者。 当服务被docker化时,事情变得更加复杂。 当同一个服务的两个实例运行时,必须以primefaces方式完成添加操作,即将计数器值存储在数据库中,并且每个docker实例都必须获取一个锁,获取旧值,添加一个,返回给调用者并解锁。 当实例是同一台Linux机器上的进程时,我们使用共享内存来高效地locking,读取,写入和解锁共享数据,并且性能被接受。 但是,当我们使用docker和数据库时,性能很低。 结果是好的,但性能低下。 dockerized属性的实例之间执行像上面描述的操作之间的规范方式是什么? 容器化过程是否有“共享内存”function?

为什么Linux的调度程序将两个线程放在具有超线程的处理器的相同物理内核上?

我读过多处,Linux的默认调度程序在多核机器上是超线程感知的 ,这意味着如果你有一台拥有2个真实核心(4 HT)的机器,它不会将两个繁忙的线程调度到逻辑核心上他们都运行在相同的物理内核上(这在很多情况下会导致性能成本的2倍)。 但是当我在英特尔i5-2520M上运行stress -c 2 (产生两个线程在100%的CPU上运行)时, 它经常 将两个线程 调度 (并保持) 到HT核心1和2上,这两个线程映射到相同的物理核心 。 即使系统空闲,否则。 这也发生在真正的程序(我在这里使用stress ,因为它使得它很容易重现),当这种情况发生时,我的程序可以理解需要两倍的时间运行。 使用taskset手动设置亲和力可以修复我的程序,但是我希望HT认知调度程序能够自己正确地做到这一点。 您可以使用egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'findHT->物理核心configurationegrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g' egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g' 。 所以我的问题是:为什么调度程序把我的线程放在同一个物理内核上呢? 笔记: 这个问题与这个问题非常相似,答案就是说Linux有一个非常复杂的HT调度线程调度器 。 如上所述,我无法观察到这个事实(检查自己的stress -c ),并想知道为什么。 我知道我可以为我的程序手动设置处理器关联,例如使用taskset工具或sched_setaffinity函数。 这不是我正在寻找的,我希望调度程序自己知道把两个繁忙的线程映射到一个物理核心并将一个物理核心完全清空并不是一个好主意。 我知道在某些情况下 ,你更喜欢把线程安排在同一个物理核心上,而把另一个核心放在空闲的位置,但是调度程序大概只有1/4的情况似乎是无意义的。 在我看来,它select的HT内核是完全随机的,或者是在调度时活动最less的HT内核,但是这并不是非常了解超线程的,因为考虑到stress特性的程序有多好从单独的物理内核运行。