几个问题

缘起

没啥可说的,面试被问了几个问题,感觉当时答的不太好,事后查了下文档,特此记录下。

Docker 是基于什么

我理解是问 Docker 技术的底层原理是什么。

先看看 Docker 官方是怎么说的:

The underlying technology((Docker 的)底层技术)

里面提到了四个方面:

  • Namespaces
  • Control groups
  • Union file systems
  • Container format

Namespaces

这个其实就是 Linux 本身就支持的东西,Linux 支持 8 种 namespace(来自于 NAMESPACES 的 manual):

Namespace Flag Page Isolates
Cgroup CLONE_NEWCGROUP cgroup_namespaces(7) Cgroup root directory
IPC CLONE_NEWIPC ipc_namespaces(7) System V IPC, POSIX message queues
Network CLONE_NEWNET network_namespaces(7) Network devices, stacks, ports, etc.
Mount CLONE_NEWNS mount_namespaces(7) Mount points
PID CLONE_NEWPID pid_namespaces(7) Process IDs
Time CLONE_NEWTIME time_namespaces(7) Boot and monotonic clocks
User CLONE_NEWUSER user_namespaces(7) User and group IDs
UTS CLONE_NEWUTS uts_namespaces(7) Hostname and NIS domain name

Docker 用到了其中的 2、3、4、5、8 五种 namespaces

Control groups

这其实就是 cgroups,这也是 Linux kernel 就支持的一种技术

Union file systems

这也就是 UnionFS,它可以把各个目录的内容挂载到同一个目录下。它的功能很复杂,Docker 的文件系统分层的架构就是由它实现的。

Container format

文档上说 Docker 引擎把 namespaces、cgroups 和 UnionFS 组装到一个叫包装器的东西,就是 Container format,Docker 里缺省的叫 libcontainer,现在好像叫 runc 了。

CLOSE_WAIT 状态

这个其实稍稍冷静下来画画状态迁移图就能想起来:被动关闭 tcp 连接的一方进入的第一个状态就是 CLOSE_WAIT,在这个状态里会通知应用层:对端过来发数据的通道已关闭,己方有数据要往对端发的赶紧发:),接下来应用发完剩下的数据后,会给对端再发 Fin,同时进入 LASK_ACK 状态,收到对端回的 ACK 后变成 CLOSED 状态。

elasticsearch 集群中的节点类型

这个其实不是面试题,只是我想到了,就贴在这里。官方文档在这里:ES 集群里的各种节点

  1. Master-eligible node
    这也就是传说中的 Master node,主节点。
  2. Data node
    数据节点,没啥好解释的。
  3. Ingest node
    翻译叫预处理节点字面上可能不太对,但意思是合适的,就是在数据写入或做 index 之前的预处理,像 pipeline 啥的
  4. Tribe node
    这个也简单,译作部落节点完全是字面翻译,其实理解为这是可以连接多个 elasticsearch 集群的节点就对了.
  5. Machine learning node
    机器学习节点,这个需要在大开了 xpark.ml.enabled 和 node.ml 之后才会有,我们一般的场景用不到。
  6. Coordinating node
    协调节点,老版本中也有叫客户端节点(Client node)的。所有的节点都是协调节点,当然也可以单独配置独立的协调节点。客户端读写 elasticsearch 都是先连的协调节点。协调节点把请求分发到合适的节点,收集返回的数据处理完毕再返回给客户端。官方文档貌似不建议使用单独的协调节点,认为数据节点可以同时做好协调节点的工作。

jvm 堆的 32G 内存问题

简言之,当 jvm 堆的内存在 32G 以内时,系统会启用一个内存对象指针压缩技术,将内存对象指针(64 位)压缩;但当大于 32G 时,这个压缩技术不启用,系统必须使用 64 位的指针,导致内存浪费增大,而且大内存对于 GC 时也会更容易导致问题。