几个问题
缘起
没啥可说的,面试被问了几个问题,感觉当时答的不太好,事后查了下文档,特此记录下。
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 集群里的各种节点
- Master-eligible node
这也就是传说中的 Master node,主节点。 - Data node
数据节点,没啥好解释的。 - Ingest node
翻译叫预处理节点字面上可能不太对,但意思是合适的,就是在数据写入或做 index 之前的预处理,像 pipeline 啥的 - Tribe node
这个也简单,译作部落节点完全是字面翻译,其实理解为这是可以连接多个 elasticsearch 集群的节点就对了. - Machine learning node
机器学习节点,这个需要在大开了 xpark.ml.enabled 和 node.ml 之后才会有,我们一般的场景用不到。 - Coordinating node
协调节点,老版本中也有叫客户端节点(Client node)的。所有的节点都是协调节点,当然也可以单独配置独立的协调节点。客户端读写 elasticsearch 都是先连的协调节点。协调节点把请求分发到合适的节点,收集返回的数据处理完毕再返回给客户端。官方文档貌似不建议使用单独的协调节点,认为数据节点可以同时做好协调节点的工作。
jvm 堆的 32G 内存问题
简言之,当 jvm 堆的内存在 32G 以内时,系统会启用一个内存对象指针压缩技术,将内存对象指针(64 位)压缩;但当大于 32G 时,这个压缩技术不启用,系统必须使用 64 位的指针,导致内存浪费增大,而且大内存对于 GC 时也会更容易导致问题。