今天在龙芯上帮人看一个叫做fastdfs的分布式文件系统启动报错的问题,报 pthread_attr_setstacksize 非法参数。
这个函数的参只有两个,pthread句柄和stack大小。看上去都不会出问题,鉴于X86上此程序运行无误,那就先不怀疑句柄的问题,看看stack_size。
这里传进去的stack_size是64KB,满足MIPS栈堆double word对齐的要求,也满足两个16KB页的要求(没错,相对于x86的4KB页,通常情况下龙芯是16KB页,这可以减少TLB Entries,带来性能提升)。
检查了一下,发现MIPS在<limits.h>下定义了 PTHREAD_STACK_MIN = 131072(128KB) 而x86下,它则是16384(16KB)。
仔细一想,MIPS的页大小在内核里可配置的,从4KB到64KB都可以(不要和我讲HugePage,这里讲的是正常页)。为了保证无论如何一个thread的stack都大于两个页,这里Minimum Stack Size就要取64KB的两倍128KB。
至于fastdfs的问题如何解决,直接去tracker.conf里把Stack Size改成128KB就好啦。优雅的方法是源码里加个检查,可惜我是一条懒狗。