之前测试的时候发现有时从Jenkins上拉下来的的megawise二进制包解压启动之后,执行第一条sql非常慢,需要1.5~3.5分钟不等。
后来docker化之后发现,docker中稳定必现第一条sql长时间卡住的问题。
当时查看日志发现总会卡在zdb_storage的一个MetaAgg的函数中,后来将这个函数注释掉,发现这个问题还是没有解决,会在engine中卡住。
百思不得其解之际,叶富哥一语惊醒梦中人:“好像都是卡在cuda调用的地方”。
从这个方向入手调查,果然找到了问题。
-------------------------------------揭开谜底的分割线------------------------------------------------
随着Nvidia gpu不断发展以支持新的特性,其指令集架构自然也发生了编号。由于应用程序需要在多代gpu上运行,Nvidia编译器工具链在同一个应用的可执行文件或者库中支持对多个不同架构的编译。
CUDA还依赖PTX(Parallel Thread Execution)虚拟GPU ISA(Instruction Set Architecture)来提供向前兼容性,以便已经部署的应用程序可以运行在未来的GPU架构之上。Nvidia编译器nvcc为了提供前向和
后向的兼容性,使用两段编译模型。第一个编译阶段将源代码编译成PTX虚拟汇编码,第二个阶段将PTX码编译成目标架构的二进制代码。CUDA驱动在运行时执行第二阶段编译。这种即时编译就会导致
应用程序在启动时(准确的说是在CUDA上下文创建的时候)产生一定的时间开销。CUDA使用两种方式来减少JIT(just-in-time)编译的时间开销:fat binaries和JIT缓存。
Fat Binaries
第一种完全避免