
ps -auxf 可以帮助我们排查出进程之间的依赖关系, 进而解决问题
功夫全在于细节之处,我们唯有记录下我们在开发过程中遇到的种种之前不甚了解的知识点,我们才能够真真正正向着一流的数据库内核研发者而挺进.
今天记录的内容乃是我在改动数据库内核时所遇到的一个问题以及解决思路, 期待它能够为其它的读者,带来新的参考与借鉴,首先,让我们对项目的背景信息,建立一个了解,参考下面的内容.
cmake 对于项目编译的组织方式
项目从某种意义上面看,便是由一个个模块所组成(无论是单独的函数,数个函数组成的类,乃至于源文件,乃至于数个源文件构成的一个模块文件夹),而项目的编译与构建,显然就是这些模块逐个被编译构建与组装的流程.
比如, PostgreSQL 这一数据库内核工程,除了由后端服务器主进程及数个辅助进程外,还包含着许多有用的小工具,这些小工具就被分门别类地摆放于各自的文件夹中,并且在各自的文件夹中,写入了编译各自文件的方式, 如图所示:
(PostgreSQL 中的 bin 文件夹,存放着许多有用的工具, 如 psql)
(我们以 pg_resetwal 为例,可以看到, pg_resetwal 中提供了 Meson 和 make 两种构建方式)
而构建模块的方式,归根结底,便在于传入某些指令给编译器,协调其编译各个源文件成对象文件,并最终组装成二进制可执行文件或是某种库文件.
(大型的工程,则是对于数个,乃至于数十个模块的集中处理,这种构建的原理,因为是具有普遍性的,因此许多的项目源码构建工具,便以此为依据被开发了出来,他们用不同的方式,贯彻着这种思路)
(cmake 的实现思路,便是采用 CMakeLists.txt 对项目整体展开一个描述,之后将各个子模块采用"外部项目"或是"子文件夹"的形式加以管理,由此实现对于项目构建全局的管理)
而在编译的时候,cmake 支持多线程编译, 即对于那些不存在冲突关系的分立任务, 采行在各个线程中运行的办法,并在一定的时期加以汇总, 进而提升构建的效率, 为程序员节约时间.
可惜的事情在于,对于一部分出现问题的子线程(这种情况在我遇到的时候,是因为一个"外部项目"所指向的链接不正确,进而导致一直下载不下来),cmake 就会卡住,而因为我们此时并不清楚,究竟是卡在了哪一个地方,此时往往就会陷入到"无限等待"之中(因为停顿不是错误,因此直观的信息非常有限).
而 ps -auxf
指令(感谢刘欢老师),则可以帮助我们,解决这个问题,参考下图:
可以看到,这条指令,能够直观地展现出,我们在运行 cmake 时,各个线程正在运行的指令,因此,在卡住的时候,只需要依此展开排查,既可以解决问题.