Articles of 性能

在Linux上的性能分析

什么是在* nix上分析C / C ++应用程序的最佳工具? (我希望能够分析一个混合了(阻塞)文件IO,networkingepoll和fork()/ execv()的服务器,但是一般的帮助和更多的常规工具也是值得赞赏的。) 你能在一个概述中看到RAM,CPU,networking和磁盘的大系统图,并钻入它吗? 在内核列表上有很多关于perf timechart ,但是我还没有发现Ubuntu上的任何东西。

测量NUMA(非一致内存访问)。 没有可观察到的不对称性。 为什么?

我试图测量NUMA的不对称内存访问效果,并失败。 本实验 采用Intel Xeon X5570 @ 2.93GHz,2个CPU,8个内核。 在固定为核心0的线程上,我在numa_alloc_local的核心0的NUMA节点上分配一个大小为10,000,000字节的数组x 。 然后我遍历数组x 50次,读写数组中的每个字节。 测量经过的时间做50次迭代。 然后,在我的服务器的每个其他核心,我钉一个新的线程,并再次测量经过的时间做50读和写入arraysx中的每个字节的迭代。 数组x很大,以尽量减lesscaching效应。 我们想要测量CPU必须一直到RAM加载和存储的速度,而不是在caching帮助时。 在我的服务器中有两个NUMA节点,所以我希望在分配数组x的同一个节点上具有亲和性的核心具有更快的读/写速度。 我没有看到。 为什么? 也许NUMA只与具有8-12个核心的系统有关,正如我在别处看到的那样? http://lse.sourceforge.net/numa/faq/ numatest.cpp #include <numa.h> #include <iostream> #include <boost/thread/thread.hpp> #include <boost/date_time/posix_time/posix_time.hpp> #include <pthread.h> void pin_to_core(size_t core) { cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(core, &cpuset); pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); } std::ostream& operator<<(std::ostream& os, const bitmask& bm) { for(size_t i=0;i<bm.size;++i) { os […]

linux perf:如何解释和查找热点

我今天尝试了linux的perf工具,在解释结果时遇到麻烦。 我习惯了valgrind的callgrind,这对于基于抽样的perf方法来说当然是完全不同的方法。 我做了什么: perf record -g -p $(pidof someapp) perf report -g -n 现在我看到这样的东西: + 16.92%kdevelop libsqlite3.so.0.8.6 [。] 0x3fe57↑ + 10.61%kdevelop libQtGui.so.4.7.3 [。]0x81e344▮ + 7.09%kdevelop libc-2.14.so [。] 0x85804▒ + 4.96%kdevelop libQtGui.so.4.7.3 [。] 0x265b69▒ + 3.50%kdevelop libQtCore.so.4.7.3 [。] 0x18608d▒ + 2.68%kdevelop libc-2.14.so [。] memcpy▒ + 1.15%kdevelop [kernel.kallsyms] [k] copy_user_generic_string▒ + 0.90%kdevelop libQtGui.so.4.7.3 [。] QTransform :: translate(double,double)▒ […]

运行多个python程序时的高内核CPU

我开发了一个庞大的数值计算python程序。 我运行在32位Xeon CPU,64GB内存和Ubuntu 14.04 64位的Linux机器上。 我并行启动多个具有不同模型参数的python实例,以使用多个进程而不必担心全局解释器锁(GIL)。 当我使用htop监视CPU利用率时,我发现所有内核都被使用,但大部分时间是由内核使用的。 一般来说,内核时间是用户时间的两倍多。 我担心系统级别会有很多开销,但我无法find原因。 如何减less高内核CPU使用率? 这是我做的一些观察: 这种效果与我是运行10个作业还是50无关。如果作业less于核心,则不是使用所有核心,但使用的核心仍然具有较高的CPU使用率 我使用numba实现了内部循环,但问题与此无关,因为删除numba部分不能解决问题 我也认为这可能与使用python2类似于这个问题中提到的问题,但从python2切换到python3并没有太大的改变 我测量了由OS执行的上下文切换总数,每秒大约10000次。 我不确定这是否是一个很大的数字 我试图通过设置sys.setcheckinterval(10000) (python2)和sys.setswitchinterval(10) (python3)来增加python时间片,但没有一个帮助 我试图通过运行schedtool -B PID影响任务调度器,但是这没有帮助 编辑:这是htop的截图: 我也运行perf record -a -g ,这是由perf report -g graph : Samples: 1M of event 'cycles', Event count (approx.): 1114297095227 – 95.25% python3 [kernel.kallsyms] [k] _raw_spin_lock_irqsave ◆ – _raw_spin_lock_irqsave ▒ – 95.01% extract_buf ▒ […]

为什么malloc依赖于从某个阈值开始的mmap?

我正在读一些关于malloc的信息,并在malloc的手册页中find了以下内容: 通常,malloc()从堆中分配内存,并根据需要使用sbrk(2)调整堆的大小。 当分配大于MMAP_THRESHOLD字节的内存块时,glibc malloc()实现使用mmap(2)将内存分配为专用匿名映射。 MMAP_THRESHOLD默认为128 kB,但可以使用mallopt(3)进行调整。 使用mmap(2)执行的分配不受RLIMIT_DATA资源限制的影响(请参阅getrlimit(2))。 所以基本上从阈值MMAP_THRESHOLD malloc开始使用mmap开始。 有没有任何理由切换到大块的mmap? 这可能会影响stream程执行的性能吗? mmap系统调用是否强制上下文切换?

Linux时间分割进程还是线程?

一位教授曾经在课堂上告诉我们,Windows,Linux,OS X和UNIX在线程上而不是在进程上扩展,因此,即使在单个处理器上,线程也可能会使应用程序受益,因为应用程序将在CPU上获得更多时间。 我试着用我的机器上的以下代码(它只有一个CPU)。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_t xs[10]; void *nop(void *ptr) { unsigned long n = 1UL << 30UL; while(n–); return NULL; } void test_one() { size_t len = (sizeof xs) / (sizeof *xs); while(len–) if(pthread_create(xs+len, NULL, nop, NULL)) exit(EXIT_FAILURE); len = (sizeof xs) / (sizeof *xs); while(len–) if(pthread_join(xs[len], NULL)) exit(EXIT_FAILURE); } […]

pthread互斥量的开销?

我正在尝试使C ++ API(用于Linux和Solaris)是线程安全的,以便可以从不同线程调用其函数,而不会破坏内部数据结构。 在我目前的方法中,我使用pthread mutexes来保护对成员variables的所有访问。 这意味着一个简单的getter函数现在可以locking和解锁一个互斥锁,而且我担心这个开销,尤其是当API主要用于单线程应用程序时,任何互斥锁似乎都是纯粹的开销。 所以,我想问一下: 你有使用锁的单线程应用程序的性能有什么经验吗? 这些locking/解锁呼叫有多昂贵,比如。 一个简单的“返回this-> isActive”访问一个布尔成员variables? 你知道更好的方法来保护这种variables访问?

为什么这个延迟循环在几次迭代之后开始运行得更快而没有睡眠?

考虑: #include <time.h> #include <unistd.h> #include <iostream> using namespace std; const int times = 1000; const int N = 100000; void run() { for (int j = 0; j < N; j++) { } } int main() { clock_t main_start = clock(); for (int i = 0; i < times; i++) { clock_t start = […]

在Linux上进程之间传递消息的最快技术?

在Linux上,C ++应用程序进程之间发送消息的最快技术是什么? 我隐约地意识到以下技术在桌面上: TCP UDP 套接字 pipe道 命名pipe道 内存映射文件 有没有更多的方法,什么是最快的?

成千上万的文件在同一个Linux目录中是否正确(性能明智)?

众所周知,在Windows中,当您尝试打开其中一个文件时,具有太多文件的目录将具有可怕的性能。 我有一个只能在Linux下执行的程序(目前它在Debian-Lenny上,但我不想具体说明这个发行版),并将许多文件写入同一个目录(作为一个存储库)。 我认为“很多”是每天几十,这意味着一年之后,我想有5000-10000个文件。 它们是为了保存(一旦文件被创build,它从来没有被删除),并假定硬盘具有所需的容量(如果没有,应该升级)。 这些文件的大小范围很广,从几KB到几十MB(但是不超过)。 名称始终是数值,逐渐生成。 我担心长期的性能下降,所以我会问: 把全部写到同一个目录是可以的吗? 或者我应该考虑为每个X文件创build一组子目录? 我是否需要一个特定的文件系统用于这样的目录? 什么是更强大的select? 专门的文件系统? 哪一个? 任何其他考虑/推荐?