多线程程序中,默认情况下各个线程的名字与进程名相同,但是可以通过操作系统提供的接口(prctl)修改这个名字。方法很简单,但某些时候,可以给程序的调试和运维带来很大的帮助。
最近在调优tair的proxy server,其中使用到了tair client,每个tair client会创建若干个线程用于网络IO,另外proxy server本身还有其他IO线程。压测过程中发现,某个线程CPU彪到了100%,其他线程只有50%左右。根据该线程的调用栈可以推测出是tair client的IO线程,但其他IO线程不好分辨属于tair client还是proxy server。将IO线程按照功能命名后,发现4个tair client IO线程中,一个线程跑满了所在CPU核心,其他三个一直处于空闲状态。因此可以推断出tair client在连接分配上存在问题……找到了问题根源,解决起来就很容易了。
给当前线程命名的一个例子:
1 2 3 4 5 6 7 8 | #include <sys/prctl.h> void set_thread_name(const char *prefix) { static int index = 0; char thname[16]; snprintf(thname, sizeof(thname), "%s%d", prefix, __sync_fetch_and_add(&index, 1)); prctl(PR_SET_NAME, (usigned long)thname, 0, 0, 0); //~ refer to `man prctl` } |