1. NR_KERNEL_STACK是干什么用的?
通过下面的命令,我们可以查看内核栈的数量:
cat /proc/vmstat | grep stack
nr_kernel_stack 567
这个值在内核中的宏为:NR_KERNEL_STACK,表示当前内核中有多少个内核栈。
我们使用这个数字来监控K8S节点上使用PID的数量,以避免PID被耗尽。
2. 那么PID与内核栈有什么关系呢?
在linux系统中,每个进程、子进程和线程在运行时都会有一个PID。这些进程或线程在运行时,因为CPU需要进行任务切换,在任务切换时就需要上下文交换,在上下文交换时就需要把当前进程的上下文压到内核栈内去,以便下次再运行时取出继续执行。
所以可以确定:每个进程、子进程和线程都会有一个内核栈。内核栈的数量与PID的数量大致相当。
注:基于linux内核的线程,比如java的线程与linux的线程是一一对应的,nodejs只使用了linux的进程,线程模型是其自己实现的,golang最特别,使用了多进程,每个进程上有多线程(基于内核),线程上还是自己实现的协程或者说goroute(可以理解为自己实现的线程)