面试总喜欢被问Redis是单线程还是多线程,千篇一律的回答单线程却不知所以然,严格来说Redis是多线程多进程、单线程处理请求,本文说的就是多线程下的BIO(Background I/O service)。
【Redis源码分析】Redis启动过程是这样的!
redis的源码确实是比我想象中要好读,本身是过程式编程,所以很多核心逻辑已经包含在main函数的调用链,流程非常长,耐心看下去还是能get到些东西的。
【问题小解决】PID耗尽的危害
如何判断 PID 耗尽
首先要确认当前的 PID 限制,检查全局 PID 最大限制:
|
|
也检查下线程数限制:
|
|
再检查下当前用户是否还有ulimit
限制最大进程数。
确认当前实际 PID 数量,检查当前用户的 PID 数量:
|
|
如果发现实际 PID 数量接近最大限制说明 PID 就可能会爆满导致经常有进程无法启动,
低版本内核可能报错:Cannot allocate memory
,这个报错信息不准确,
在内核 4.1 以后改进了: https://github.com/torvalds/linux/commit/35f71bc0a09a45924bed268d8ccd0d3407bc476f
【问题小解决】MySQL高可用集群之双主多从
通常MySQL主从复制主要用来解决读写分离,分担服务器压力。MySQL互为主备实现服务的高可用;这里同时基于高可用和负载均衡。
环境准备
主机名/角色 | VIP | IP地址 | 操作系统 | MySQL版本 |
---|---|---|---|---|
Node0/master1 | 172.16.10.100 | 172.16.10.10 | CentOS8.1.1911 | 8.0.17 |
Node1/master2 | 172.16.10.11 | CentOS8.1.1911 | 8.0.17 | |
Node2/slave1 | 172.16.10.12 | CentOS8.1.1911 | 8.0.17 |
安装MySQL
在所有节点上执行dnf -y install mysql mysql-server
,并在master节点上配置server-id并开启bin-log
|
|
执行systemctl enable --now mysqld
运行Mysql
【生产问题】分享一次Nginx正向代理的需求
最近接到了一个需求:通过 Nginx 代理把现网一个自研代理程序给替换掉,感觉有点意思,也有所收益,简单分享下。
需求背景
部门的生产环境异常复杂,有部分第三方引入的系统位于特殊网络隔离区域,请求这些系统需要通过 2 层网络代理,如图所示:
中心源系统请求目标系统 API 的形式各异,我简单收集了下,至少有如下 3 种:
|
|
【基础知识】Linux的xargs命令
昨天在给服务器做年终“大扫除”整理时,发现有个目录下因为文件过多而删除失败,最终使用xargs
才搞定,于是顺便来记录下。
在执行某些命令时,当 Linux 某个目录下文件过多就会因为“参数列表过长”而报错无法执行。比如,我要清空/var/spool/clientmqueue/
下的庞大数量的临时文件,
如果直接执行rm -f *
,有时就会会出现“参数列表过长”的错误提示,因为 linux 下一般的命令的参数的总长度不能超过 4096 个字节。
这时,xargs
就应该上场了了,由于服务器数量很多,我直接在每台服务器上执行如下命令,即可清理此文件夹内的所有文件:
|
|
【网络编程】从Linux角度以及JVM源码,深入NIO的细节
最近一段时间都在啃Linux内核, 也给了自己机会再度深入理解Java的NIO实现,希望能获得更多东西,尝试理解以前未能理解的,会涉及少量OpenJDK源码。
因为NIO本身的实现很多牵扯到操作系统,所以需要先稍微过一下,有理解不对的地方,请指出。
1、涉及的Linux知识
1.1、文件描述符
对于Linux来说,一切皆为文件,设备文件、IO文件还是普通文件,都可以通过一个叫做文件描述符(FileDescriptor)的东西来进行操作,其涉及的数据结构可以自行了解VFS。
1.1.1、设备阻塞与非阻塞
任意对设备的操作都是默认为阻塞的,如果没有或有不可操作的资源,会被添加到wait_queue_head_t
中进行等待,直到被semaphore
通知允许执行。此时可以通过fcntl()
函数将文件描述符设置为非阻塞,若没有或有不可操作的资源,立即返回错误信息。
1.2、JVM内存结构 & 虚拟地址空间
众所周知,Linux下的每一进程都有自己的虚拟内存地址,而JVM也是一个进程,且JVM有自己的内存结构。既然如此,两者之间必有对应关系,OracleJDK7提供了NMT,用jcmd pid VM.native_memory detail
可以查看各类区域的reserved,被committed的内存大小及其地址区间,再通过pmap -p
可以看到进程内存信息。
肉眼对比地址区间可以发现,JVM heap是通过mmap分配内存的,位于进程的映射区内,而进程堆区可以被malloc进行分配,对应关系如图。
Linux常用命令详解
- ls
|
|
- touch
|
|
- cat
|
|
- kill
|
|
Oh My Zsh自动补全
Grep无法查找shell传过来的变量?
差不多两周前,同事告诉我发现一个诡异的问题,grep 无法搜索 shell 中的变量,着实很惊讶。到他所说的服务器上试了下,还真是不行!
大概就是这样一个要求:
- 有个文本为 userid.txt,里面每一行一个用户 id,类似如下:
|
|
- 另外还有一个文本为 record.txt,里面是所有用户的操作记录,一行一条,并且包含有 id,类似如下:
|
|