1.文件访问控制列表ACL
https://www.linuxprobe.com/chapter-05.html
---------------------------------------------------------------
不知道大家是否发现,前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
为了更直观地看到ACL对文件权限控制的强大效果,我们先切换到普通用户,然后尝试进入root管理员的家目录中。在没有针对普通用户对root管理员的家目录设置ACL之前,其执行结果如下所示:
[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar 21 16:31:19 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ cd /root
-bash: cd: /root: Permission denied
[linuxprobe@linuxprobe root]$ exit
--1. setfacl命令
setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。下面来设置用户在/root目录上的权限:
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root
[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ cd /root
[linuxprobe@linuxprobe root]$ ls
anaconda-ks.cfg Downloads Pictures Public
[linuxprobe@linuxprobe root]$ cat anaconda-ks.cfg
[linuxprobe@linuxprobe root]$ exit
是不是觉得效果很酷呢?但是现在有这样一个小问题—怎么去查看文件上有那些ACL呢?常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了。现在大家是不是感觉学得越多,越不敢说自己精通Linux系统了吧?就这么一个不起眼的点(.),竟然还表示这么一种重要的权限。
[root@linuxprobe ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2017 /root
--2. getfacl命令
getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。Linux系统中的命令就是这么又可爱又好记。想要设置ACL,用的是setfacl命令;要想查看ACL,则用的是getfacl命令。下面使用getfacl命令显示在root管理员家目录上设置的所有ACL信息。
[root@linuxprobe ~]# getfacl /root
getfacl: Removing leading \'/\' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---
------------------------------------------------------------
2.nginx中fastcgi_params配置参数
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径,也就是说当访问127.0.0.1/index.php的时候,需要读取网站根目录下面的index.php文件,如果没有配置这一配置项时,nginx不回去网站根目录下访问.php文件,所以返回空白
fastcgi_param QUERY_STRING $query_string; #请求的参数;如?app=123
fastcgi_param REQUEST_METHOD $request_method; #请求的动作(GET,POST)
fastcgi_param CONTENT_TYPE $content_type; #请求头中的Content-Type字段
fastcgi_param CONTENT_LENGTH $content_length; #请求头中的Content-length字段。
fastcgi_param SCRIPT_NAME $fastcgi_script_name; #脚本名称
fastcgi_param REQUEST_URI $request_uri; #请求的地址不带参数
fastcgi_param DOCUMENT_URI $document_uri; #与$uri相同。
fastcgi_param DOCUMENT_ROOT $document_root; #网站的根目录。在server配置中root指令中指定的值
fastcgi_param SERVER_PROTOCOL $server_protocol; #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
fastcgi_param GATEWAY_INTERFACE CGI/1.1; #cgi 版本
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; #nginx 版本号,可修改、隐藏
fastcgi_param REMOTE_ADDR $remote_addr; #客户端IP
fastcgi_param REMOTE_PORT $remote_port; #客户端端口
fastcgi_param SERVER_ADDR $server_addr; #服务器IP地址
fastcgi_param SERVER_PORT $server_port; #服务器端口
fastcgi_param SERVER_NAME $server_name; #服务器名,域名在server配置中指定的server_name
fastcgi_param PATH_INFO $path_info; #可自定义变量
-- PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
在php可打印出上面的服务环境变量 如:
echo $_SERVER[\'REMOTE_ADDR\']
3.PVW、PGM、ME是什么意思
PVW是Preview,就是预监信号;就是演播室里的预监画面,广电行业亦称PST;PGM是Program,是播出信号。PVW主要是配合PGM使用,因为在实际播出PGM信号时,至少要提前看一下。提前看看,就是预监,如果觉得这个景别可以,就可以立马转为PGM。PVW与PGM形成演播室的两个主要输出信号。ME就是“混合,特效”的意思,也是影像架构的意思。就是在拍摄背景上有所讲究,如在背景幕布颜色的选择上,亚洲地区多用蓝色背景。
4.Polkit
https://wiki.archlinux.org/index.php/Polkit_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
5.云直播p2p
P2P直播模块是在P2P传输功能的基础上,增加了视频音频直播的处理逻辑(包括视频的采集和播放)构建的视频直播开发包。支持在Windows、Android和IOS通用操作系统上的内置视频音频采集功能。支持外部视频音频输入输出接口,方便在嵌入式系统对接外部采集的视频音频。支持MJPEG、VP8、H.264和H.265视频编解码。支持视频设置不同的编码类型、码率、帧率和分辨率。
点对点技术(peer-to-peer, 简称P2P)又称对等互联网络技术,是一种网络新技术,依赖网络中参与者的计算能力和带宽,而不是把依赖都聚集在较少的几台服务器上。P2P网络通常用于通过Ad Hoc连接来连接节点。这类网络可以用于多种用途,各种文件共享软件已经得到了广泛的使用。P2P技术也被使用在类似VoIP等实时媒体业务的数据通信中。
纯点对点网络没有客户端或服务器的概念,只有平等的同级节点,同时对网络上的其它节点充当客户端和服务器。这种网络设计模型不同于客户端-服务器模型,在客户端-服务器模型中通信通常来往于一个*服务器。
有些网络(如Napster, OpenNAP, 或IRC @find)的一些功能(比如搜索)使用客户端-服务器结构,而使用P2P结构来实现另外一些功能。类似Gnutella 或Freenet的网络则使用纯P2P结构来实现全部的任务。
6.添加路由表路由以及理由策略相关命令
#创建路由表
echo "10 t1" >> /etc/iproute2/rt_tables //10位路由id,t1为表名。对表操作时,可以使用id也可以使用表名。Linux支持256个表,编码为0-255
echo "20 t2" >> /etc/iproute2/rt_tables
#设置默认路由表路由
ip route del default //删除默认路由,会导致网络中断
ip route add default dev eth0 via 192.168.1.1
#给创建的表添加路由
ip route add default dev eth0 via 192.168.1.1 table 10
ip route add default dev eth1 via 192.168.1.1 table 20
ip route list table 10 //查看特定表路由
ip route list table main //查看主表路由
ip route list //查看所有表路由
#配置路由表策略
ip rule add from 192.168.1.5 table 10
ip rule add from 192.168.1.62 table 20
ip rule list table main //查看主表路由策略
ip rule list table 10 //查看特定表路由策略
ip rule list //查看所有表路由策略
#说明
重启机器或者网络会导致路由表失效,需要重新配置。可以通过启动脚本写入路由
7.CentOS 7配置nginx-1.13.10支持http/2和Server Push
https://blog.csdn.net/weixin_30825199/article/details/94910236
https://www.imydl.tech/lnmp/331.html
8.Linux查看硬件信息命令
(1)查看服务器型号、序列号
dmidecode|grep "System Information" -A9|egrep "Manufacturer|Product|Serial"
(2)查看主板型号
dmidecode |grep -A16 "System Information$"
(3)查看BIOS信息
dmidecode -t bios
(4)查看内存槽及内存条
dmidecode -t memory | head -45 | tail -23
(5)查看网卡信息
dmesg | grep -i Ethernet
(6) 查看pci信息,即主板所有硬件槽信息
lspci | head -10
CPU篇:
(7)查看cpu型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
(8)查看系统中实际物理CPU的数量(物理)
grep \'physical id\' /proc/cpuinfo | sort | uniq | wc -l
(9)系统中实际物理CPU的数量(核数)
cat /proc/cpuinfo |grep \'processor\'|wc -l
(10)查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo |grep "cores"|uniq
(11)查看CPU的主频
cat /proc/cpuinfo |grep MHz|uniq
(12)查看CPU的详细信息
cat /proc/cpuinfo | head -20
(13)查看CPU的相关信息
lscpu
(14)查看cpu运行模式
getconf LONG_BIT
(15)查看cpu是否支持64bit
cat /proc/cpuinfo | grep flags | grep \' lm \' | wc -l
内存篇:
(16)查看内存硬件信息
dmidecode -t memory | head -45 | tail -24
(17)最大支持多少内存
dmidecode|grep -P \'Maximum\s+Capacity\'
(18)Linux 查看内存的插槽数,已经使用多少插槽.每条内存多大
dmidecode |grep -A5 "Memory Device" |grep Size |grep -v Range
(19)Linux 查看内存的频率
dmidecode|grep -A16 "Memory Device"|grep \'Speed\'
(20)Linux 查看内存的详细信息
cat /proc/meminfo |head -20
(21)Linux 查看内存的使用情况
free -m free -h
磁盘篇:
(22)查看挂接的分区状态
fdisk -l |grep Disk
(23)查看硬盘和分区分布
lsblk
(24)查看硬盘和分区的详细信息
fdisk -l
(25)查看挂接的分区状态
mount | column -t
(26)查看挂接的分区状态
swapon -s
(27)查看硬盘使用情况
df -hT
(28) 硬盘检测命令smartctl
smartctl -a /dev/sda
网卡篇:
(29)查看网卡硬件信息
lspci | grep -i \'eth\'
(30)查看系统的所有网络接口
ifconfig -a
ip link show
(30)查看某个网络接口的详细信息,例如eth0的详细参数和指标
ethtool eth0
(31)查看所有网卡的链路状态
for i in `seq 0 9`;do ethtool eth${i} | egrep \'eth|Link\';done
PCI设备:
lspci -tv | more
其它不常用查看信息命令:
hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
dmesg | grep IDE # 查看启动时IDE设备检测状况网络
chkconfig –list # 列出所有系统服务#
chkconfig –list | grep on # 列出所有启动的系统服务 程序
9.带内带外管理
什么叫带外管理?
常见的设备管理方式有SNMP、RMON、Web、TELNET以及通过CONSOLE、AUX接口管理,有些高端设备还具备100BASE-TX的带外管理端口。
我在网上查到大概SNMP、RMON、Web、TELNET这些管理方式属于带内管理,通过CONSOLE、AUX接口管理和通过某些高端设备具有的100BASE-TX的带外管理端口进行管理的方式属于带外管理。
那么所谓带内、带外是不是指跟占用生产网络带宽、接口的管理方式称之为带内管理,与此相反,不占生产网络带宽、接口的管理方式称之为带外管理?
带外网管是指通过专门的网管通道实现对网络的管理,将网管数据与业务数据分开,为网管数据建立独立通道。在这个通道中,只传输管理数据、统计信息、计费信息等,网管数据与业务数据分离,可以提高网管的效率与可靠性,也有利于提高网管数据的安全性。
带内管理使得网络中的网管数据和业务数据在相同的链路中传输,当管理数据(包括SNMP,Netflow,Radius,计费等)较多时,将会影响到整个网络的性能;管理数据的流量较少,对整个网络的性能影响不明显,可采用带内管理。
首先我们要先搞清带外网管的概念。
什么是带外网管?
从技术的角度,网络管理可分为带外管理(out-of-band)和带内管理(in-band)两种管理模式。所谓带内管理,是指网络的管理控制信息与用户网络的承载业务信息通过同一个逻辑信道传送;而在带外管理模式中,网络的管理控制信息与用户网络的承载业务信息在不同的逻辑信道传送。
简单的来说,象 Openview、CiscoWorks、Tivoli 这类的网管软件系统都是带内网管,网管系统必须通过网络来管理设备。如果无法通过网络访问被管理对象,带内网管系统就失效了,这时候带外网管系统就排上用场了。就象你家里的固定电话坏了,只能通过手机来报修一样,带外网管是网管系统中的紧急通道。
带外网管由哪几部分组成?
带外网管系统的构成:控制台服务器(Console Server)、KVM服务器、智能电源管理器(Intelligent Power Distribution Units)、带外网管Manager(Network Management)等组成。
控制台服务器:连接idc中设备的console口或RS-232串口,通过网络或modem拨号访问控制台服务器,就可以直接进入被管理设备的控制接口,即使该设备无法通过网络访问。
KVM服务器:通过KVM OVER IP技术你能从网络的任意地点,通过你的显示器、键盘鼠标来控制远端的服务器。
智能电源管理器:通过智能电源管理器,可以远程开关设备电源。
带外网管Manager是以上所有带外网管设备统一管理平台。
清楚了带外网管的概念,知道了它的构成,下面我们来聊聊带外网管的作用。
带外网管能够使用户:减少运营成本、提高运营效率、减少宕机时间、提高服务质量。
带外网管有以下几种主要功能:控制台服务器具有所有功能、KVM具备前两种功能。1、设备紧急访问通道 2、集中访问控制、分级授权管理 3、操作日志记录4、故障告警。
设备紧急访问通道:所有可以使用命令行进行配置的设备(网络设备、存储设备、unix服务器、linux服务器、win2003服务器、甚至PBX)都有 console口或RS-232串口,通过这些管理接口可以直接使用命令控制设备。控制台服务器连接到设备console或串口,在任何情况下只要能够通过网络或者拨号方式访问到控制台服务器就对设备进行操作。KVM服务器连接到设备的鼠标接口、键盘接口、视频输出接口。KVM OVER IP使用户可以用自己的鼠标、键盘远程控制设备,同时视频输出到用户本地的显示器上。使用控制台服务器+KVM组合,可以解决所有设备的非硬件故障。
集中访问控制:由于带外网管提供了访问设备的通道,因此可以把通过网络访问设备(Telnet等方式)方式进行严格限制,可以降低网络安全隐患。比如限定特定的IP地址才可以通过Telnet访问设备。大部分的访问均通过带外网管系统进行,可以把整个IT环境设备的访问统一到带外网管系统。与传统的设备管理各自为政不同,通过带外网管可以很容易做到不同用户名登录对应不同设备管理权限,一个IT TEAM可以根据各个人员职责不同进行授权。
操作日志记录:通过控制台服务器访问设备,所有的命令及结果都会被以文件方式记录下来。这样所有对于设备进行的操作均有迹可寻,这种级别的IT审计对于日后纠正错误操作和发现非法操作有非常大的贡献。尤其是在美国上市的公司要求IT审计的级别非常高,带外网管可以很好的满足这个要求。
故障告警:控制台服务器连接设备的console接口时,设备出现故障将会通过console接口发出相应的信息。所有通过console接口发出的告警信息经过过滤后可以发给用户运维人员,作为带内网管告警的补充。
什么样的IT环境需要带外网管
运维人员和IT设备不在同一个物理地点。这种类型的网络环境包括所有的电信运营商和银行及有分支机构的*、企业网络。一旦设备故障无法通过网络解决(telnet 、pcanywhere等手段),运维人员只能到现场解决问题。这种类型的网络通过带外网管可以大幅提高网络运维效率,同时有效降低运维成本。
运维人员与IT设备在同一地点,IT设备数目很多统一管理面临很大难度。这种类型IT环境包括所有IDC、企业的数据中心(非托管)、互联网公司、游戏运营商。运维TEAM需要面对几百台甚至上万台服务器,对设备的访问控制授权、操作记录均需要借助带外网管来完成。
如何组建带外网管系统
带外网管系统主要由控制台服务器、KVM服务器、智能电源管理器组成,如果一个网络中带外网管设备(指控制台服务器等)有十台以上,需要带外管理Manager来管理带外网管设备。
带外网管系统组网模式主要有两种,一种是为带外网管设备单独组网,另一种带外网管设备和管理的设备放在同一个网络中使用拨号等方式做为备份。第一种组网模式适合对于网络健壮要求较高的电信运营商或金融系统的用户。组网一般采用低带宽的专线模式,如64K的DDN、帧中继等,目前国内的运营商也有用2M传输线路组网的。第二种组网模式,带外网管设备接入到运营网络中,如果网络出现故障,通过拨号访问带外网管设备。
控制台服务器有若干个RS232接口(最多48个),通过普通CAT5网线+转换头连接到不同设备的console接口或串口。
KVM服务器上有若干个RJ45的接口,通过CAT5网线与服务器连接,网线服务器端接一个转换头。转换头带有鼠标接头和键盘接头、视频接头与服务器相连,用户通过访问KVM服务器就可以控制相应的设备。
智能电源管理器上有直流或交流电源接口与设备的电源插头连接。智能电源管理器的console接口与控制台服务器连接。通过控制台服务器控制智能电源管理器的任何一个电源单元的开关。
带外网管Manager是所有带外网管设备的网管平台。Manager只要能够访问到所有的带外网管设备即可。所有通过对单个带外网管设备的访问集中到 Manager上,只通过Manager就可以访问所有网络中的被管理的设备。同时Manager存储所有带外网管设备的日志。
带外网管与传统的路由器+八爪鱼相比有何优势?
熟悉Cisco人的都知道,一般的Cisco Lab里面都用2509或2511连接router的console口,通过反向telnet方式来进行带外管理。有一段时间,考CCIE的人多了,很多人自己建lab都买2509,二手市场2509和2511的价格一路飚升。以至于很多人一提带外网管就是使用路由器+八爪鱼进行设备管理。
路由器+八爪鱼提供了远程访问console接口的通道。但是它也仅能实现这一功能,其它的带外网管的功能它都不能实现。如果仅仅为了实现这一功能,通过modem拨号也可以实现,成本更低。大部分的设备都有异步口,接上modem后,远程拨号就可以访问该设备。
下面看一下控制台服务器比路由器+八爪鱼究竟有什么优势。在带外网管的作用一文里介绍了除了设备紧急访问通道外,还有以下三种功能:集中访问控制、分级授权管理,操作日志记录,故障告警。这三种功能路由器和串口卡都不能实现。在安全方面控制台服务器也做的更好。控制台服务器支持SSHv1、v2可以有效的防止数据泄露。通过控制台服务器可以传送SUN break信号,这点路由器和串口卡也做不到。同时通过控制台服务器访问设备,支持进行多进程操作,比如两个用户同时对于一个设备操作,或者一个操作一个观看等。
不难看出传统的路由器+八爪鱼是不能代替带外网管的。
10.rtmpdump工具
rtmp协议流下载工具
https://www.jianshu.com/p/e2c87002aa81
11.ipv6地址,测试
windows ping linux:ping -6 ipv6地址
Linux ping linux:ping6 -l eth0(网卡接口名) ipv6地址
windows telnet Linux_ipv6端口:telnet linux_ipv6地址%windows接口序列号 端口 (序列号为ipconfig -all命令ipv6地址%号后的值) #后面%接的接口地址为本机地址,目的是使用了6to4隧道技术,接口用作路由器的封装地址
Linux telnet Linux_ipv6端口:telnet -6 A_linux_ipv6地址%B_linux接口名 A_服务器端口 (B服务器telnet A服务器)
12.ipv6地址
IPv6的地址格式与IPv4不同。一个IPv6的IP地址由8个地址节组成,每节包含16个地址位,以4个十六进制数书写,节与节之间用冒号分隔,除了128位的地址空间,IPv6还为点对点通信设计了一种具有分级结构的地址,这种地址被称为可聚合全局单点广播地址(aggregatable global unicast address),其分级结构划分如图所示。开头3个地址位是地址类型前缀,用于区别其它地址类型。其后的13位TLA ID、32位 NLA ID、16位SLA ID和64位主机接口ID,分别用于标识分级结构中自顶向底排列的TLA(Top Level Aggregator,*聚合体)、NLA(Next Level Aggregator,下级聚合体)、SLA(Site Level Aggregator,位置级聚合体)和主机接口。TLA是与长途服务供应商和电话公司相互连接的公共网络接入点,它从国际Internet注册机构如IANA处获得地址。NLA通常是大型ISP,它从TLA处申请获得地址,并为SLA分配地址。SLA也可称为订户(subscriber),它可以是一个机构或一个小型 ISP。SLA负责为属于它的订户分配地址。SLA通常为其订户分配由连续地址组成的地址块,以便这些机构可以建立自己的地址分级结构以识别不同的子网。分级结构的最底级是网络主机。
https://www.cnblogs.com/qcloud1001/p/8780556.html
13.BGP带宽
https://www.freesion.com/article/93161123540/
https://baijiahao.baidu.com/s?id=1603988891006483361&wfr=spider&for=pc
14.nslookup和dig命令
nslookup与dig两个工具功能类似,都可以查询制定域名所对应的ip地址,所不同的是dig工具可以从该域名的官方dns服务器上查询到精确的权威解答,而nslookup只会得到DNS解析服务器保存在cache中的非权威解答。
nslookup:
#nslookup -type=A baidu.com 114.114.114.114 不注明dns服务器则使用本地dns服务器。
type可以是以下类型
A 地址记录
AAAA 地址记录
AFSDB Andrew文件系统数据库服务器记录
ATMA ATM地址记录
CNAME 别名记录
HINFO 硬件配置记录,包括CPU、操作系统信息
ISDN 域名对应的ISDN号码
MB 存放指定邮箱的服务器
MG 邮件组记录
MINFO 邮件组和邮箱的信息记录
MR 改名的邮箱记录
MX 邮件服务器记录
NS 名字服务器记录
PTR 反向记录
RP 负责人记录
RT 路由穿透记录
SRV TCP服务器信息记录
TXT 域名对应的文本信息
X25 域名对应的X.25地址记录
dig:
#dig @[dns服务器] [查询的域名] [type]
15.ES读写数据的工作原理
es写入数据的工作原理是什么啊?es查询数据的工作原理是什么?底层的lucence介绍一下呗?倒排索引了解吗?
一、es写数据过程
1、客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)
2、coordinating node 对document进行路由,将请求转发给对应的node(有primary shard)
3、实际的node上的primary shard 处理请求,然后将数据同步到replica node。
4、coordinating node如果发现 primary node和所有replica node都搞定之后,就返回响应结果给客户端。
二、es读数据过程
可以通过doc id 来查询,会根据doc id进行hash,判断出来当时把doc id分配到了哪个shard上面去,从那个shard去查询。
1、客户端发送请求到任意一个node,成为coordinate node
2、coordinate node 对doc id进行哈希路由,将请求转发到对应node,此时会使用round-robin随机轮询算法,在primary shard 以及其所有replica中随机选择一个,让读请求负载均衡。
3、接收请求的node返回document给coordinate node。
4、coordinate node返回document给客户端。
三、es搜索数据过程
es最强大的是做全文检索
1、客户端发送请求到一个coordinate node。
2、协调节点将搜索请求转发到所有的shard对应的primary shard 或 replica shard ,都可以。
3、query phase:每个shard将自己的搜索结果(其实就是一些doc id)返回给协调节点,由协调节点进行数据的合并、排序、分页等操作,产出最终结果。
4、fetch phase:接着由协调节点根据doc id去各个节点上拉取实际的document数据,最终返回给客户端。写请求是写入primary shard,然后同步给所有的replica shard读请求可以从primary shard 或者 replica shard 读取,采用的是随机轮询算法。
四、写数据底层原理
1、先写入内存buffer,在buffer里的时候数据是搜索不到的;同时将数据写入translog日志文件。如果buffer快满了,或者到一定时间,就会将内存buffer数据refresh 到一个新的segment file中,但是此时数据不是直接进入segment file磁盘文件,而是先进入os cache。这个过程就是 refresh。每隔1秒钟,es将buffer中的数据写入一个新的segment file,每秒钟会写入一个新的segment file,这个segment file中就存储最近1秒内 buffer中写入的数据。
2、但是如果buffer里面此时没有数据,那当然不会执行refresh操作,如果buffer里面有数据,默认1秒钟执行一次refresh操作,刷入一个新的segment file中。操作系统里面,磁盘文件其实都有一个东西,叫做os cache,即操作系统缓存,就是说数据写入磁盘文件之前,会先进入os cache,先进入操作系统级别的一个内存缓存中去。只要buffer中的数据被refresh 操作刷入os cache中,这个数据就可以被搜索到了。
3、为什么叫es是准实时的?NRT,全称 near real-time。默认是每隔1秒refresh一次的,所以es是准实时的,因为写入的数据1s之后才能被看到。可以通过es的restful api或者 java api,手动执行一次 refresh操作,就是手动将buffer中的数据刷入os cache中,让数据立马就可以被搜索到。只要数据被输入os cache中,buffer 就会被清空了,因为不需要保留buffer了,数据在translog里面已经持久化到磁盘去一份了。
4、重复上面的步骤,新的数据不断进入buffer和translog,不断将buffer数据写入一个又一个新的segment file中去,每次refresh完buffer清空,translog保留。随着这个过程的推进,translog会变得越来越大。当translog达到一定长度的时候,就会触发commit操作。
5、commit操作发生的第一步,就是将buffer中现有的数据refresh到os cache中去,清空buffer。然后将一个commit point写入磁盘文件,里面标识者这个commitpoint 对应的所有segment file,同时强行将os cache中目前所有的数据都fsync到磁盘文件中去。最后清空现有 translog日志文件,重启一个translog,此时commit操作完成。
6、这个commit操作叫做flush。默认30分钟自动执行一次flush,但如果translog过大,也会触发flush。flush操作就对应着commit的全过程,我们可以通过es api,手动执行flush操作,手动将os cache中数据fsync强刷到磁盘上去。
7、translog日志文件的作用是什么?
执行commit 操作之前,数据要么是停留在buffer中,要么是停留在os cache中,无论是buffer 还是os cache都是内存,一旦这台机器死了,内存中的数据就全丢了。所以需要将数据对应的操作写入一个专门的日志文件translog中,一旦此时机器宕机了,再次重启的时候,es会自动读取translog日志文件中的数据,恢复到内存buffer和os cache中去。
8、translog其实也是先写入os cache的,默认每隔5秒刷一次到磁盘中去,所以默认情况下,可能有5s的数据会仅仅停留在buffer或者translog文件的os cache中,如果此时机器挂了,会丢失5秒钟的数据。但是这样性能比较好,最多丢5秒的数据。也可以将translog设置成每次写操作必须是直接fsync到磁盘,但是性能会差很多。
9、es第一是准实时的,数据写入1秒后就可以搜索到:可能会丢失数据的。有5秒的数据,停留在buffer、translog os cache 、segment file os cache中,而不在磁盘上,此时如果宕机,会导致5秒的数据丢失。
10、总结::数据先写入内存buffer,然后每隔1s,将数据refresh到 os cache,到了 os cache数据就能被搜索到(所以我们才说es从写入到能被搜索到,中间有1s的延迟)。
每隔5s,将数据写入到translog文件(这样如果机器宕机,内存数据全没,最多会有5s的数据丢失),translog达到一定程度,或者默认每隔30min,会触发commit操作,将缓冲区的数据都flush到segment file磁盘文件中。数据写入 segment file之后,同时就建立好了倒排索引。
五、删除/更新数据底层原理
如果是删除操作,commit的时候会生成一个 .del文件,里面将某个doc标识为 deleted状态,那么搜索的时候根据 .del文件就知道这个doc是否被删除了。
如果是更新操作,就是将原来的doc标识为deleted状态,然后重新写入一条数据。
buffer 每refresh一次,就会产生一个segment file,所以默认情况下是1秒钟一个segment file,这样下来segment file会越来越多,此时会定期执行merge。每次merge的时候,会将多个segment file合并成一个,同时这里会将标识为 deleted的doc给物理删除掉,然后将新的segment file写入磁盘,这里会写一个commit point,标识所有新的 segment file,然后打开segment file供搜索使用,同时删除旧的segment file。
六、底层lucence
简单来说,lucence就是一个jar包,里面包含了封装好的各种建立倒排索引的算法代码。我们用java 开发的时候,引入 lucene jar,然后基于lucene的api去开发就可以了。通过lucene,我们可以将已有的数据建立索引,lucene会在本地磁盘上面,给我们组织索引的数据结果。
16.五大NAT穿透方法
许多程序在局域网中是可以适用的,但是在外网与内网之间和内网与内网之间就不可行。问题就在于NAT,本文就将介绍下5大NAT穿透方法,解决内外网的互访问题。
--1.完全锥形(Full Cone)NAT
处于不同内网的主机A和主机B,各自先连接服务器,从而在各自NAT设备上打开了一个“孔”,服务器收到主机A和主机B的连接后,知道A与B的公网地址和NAT分配给它们的端口号,然后把这些NAT地址与端口号告诉A与B,由于在完全锥形NAT的特点,A和B给服务器所打开的“孔”,能给别的任何的主机使用。故A与B可连接对方的公网地址和端口直接进行通信。服务器在这里充当“介绍人”,告诉A与B对方的地址和端口号。
--2.受限制锥形(Restricted Cone)NAT
A和B还是要先连接服务器,服务器发送A和B的地址和端口信息给A和B,但由于受限制锥形NAT的特点,他们所打开的“孔”,只能与服务器通信。要使他们可以直接通信,解决办法如下:
假如主机A开始发送一个UDP信息到主机B的公网地址上,与此同时,它又通过服务器中转发送了一个邀请信息给主机B,请求主机B也给主机A发送一个UDP信息到主机A的公网地址上。这时主机A向主机B的公网IP发送的信息导致NAT A打开一个处于主机A的和主机B之间的会话,与此同时,NAT B也打开了一个处于主机B和主机A的会话。一旦这个新的UDP会话各自向对方打开了,主机A和主机B之间就可以直接通信了[14]。
--3.端口受限制锥形(Port Restricted Cone)NAT
对于该类型的NAT,解决办法跟上面的方法一样。
--4.对称型(Symmetric)NAT
对称型NAT,对于不同的外网主机地址,它都会分配不同的端口号,所以进行UDP打孔比较困难,但也可以进行端口预测打孔,不过不能保证成功。
以上的穿透NAT,是对NAPT来进行穿透,主要是针对UDP协议。TCP协议也有可能,但是可行性非常小,要求更高。并且,语音视频通信是用UDP传输的,故针对TCP的NAT穿透在这里不作讨论。基础NAT不修改经过的数据包的端口号,它们可以看作是完全锥形NAT的精简版本,即基础NAT也可以被穿透。NAT设备将在一定时间后关闭UDP的一个映射,所以为了保持与服务器能够一直通信,服务器或客户端必须要周期性地发送UDP包,保持映射不被关闭。
--5.花生壳NAT-DDNS穿透
花生壳DDNS是将用户的动态IP 地址映射到一个固定的域名上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP 地址传送给位于服务商主机上的服务器程序,服务项目器程序负责提供 DNS 服务并实现动态域名解析。DDNS 的主要作用就是捕获用户每次变化的 IP 地址,然后将其与域名相对应,这样其他上网用户就可以通过域名来与用户交流了。
17.NAT的实现方式
--静态转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
--动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
--端口多路复用(Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。
--ALG(Application Level Gateway),即应用程序级网关技术:传统的NAT技术只对IP层和传输层头部进行转换处理,但是一些应用层协议,在协议数据报文中包含了地址信息。为了使得这些应用也能透明地完成NAT转换,NAT使用一种称作ALG的技术,它能对这些应用程序在通信时所包含的地址信息也进行相应的NAT转换。例如:对于FTP协议的PORT/PASV命令、DNS协议的 "A" 和 "PTR" queries命令和部分ICMP消息类型等都需要相应的ALG来支持。
如果协议数据报文中不包含地址信息,则很容易利用传统的NAT技术来完成透明的地址转换功能,通常我们使用的如下应用就可以直接利用传统的NAT技术:HTTP、TELNET、FINGER、NTP、NFS、ARCHIE、RLOGIN、RSH、RCP等。
18.Linux下/dev/mem和/dev/kmem的区别
/dev/mem: 物理内存的全镜像。可以用来访问物理内存。
/dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。
19.proc、sysfs、debugfs、tmpfs、devpfs
proc:/proc,伪文件系统,只存在于内存当中不占用磁盘空间,它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息、进程是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。简单来说,proc用户是查看内核和进程等系统信息的一个接口。
sysfs:/sys,也是一种虚拟的基于内存的文件系统,与proc类似,但除了和proc一样具有查看和设定内核参数的功能外,还有为linux统一设备模型作为管理之用,sysfs导出内核数据的方式更统一,并且组织的更好,设计优于proc。
debugfs:/sys/kernel/debug,没有任何规则要求,用户可以放入任何信息,主要用于调试目的。
devpts:和proc一样,是linux提供给管理员通过文件系统和内核进行沟通(读写)的一种渠道,pts是远程虚拟终端,devpts即远程虚拟终端文件设备。通过/dev/pts可以了解目前远程虚拟终端的基本情况。
20.内核参数
kernel.random.entropy_avail = 184
表示当前可以使用的随机数熵,如果这里值过小,会导致某些依赖随机数的服务出现异常
kernel.random.uuid = cbd55511-5292-4195-99f3-c7e0b5b87624
这个只读文件包含随机字符串一样。一次是在系统启动后产生。另见:与/proc/sys/kernel/random/uuid.
kernel.random.boot_id = 538713fc-3f16-4d9f-9c75-7e5e61c10ee9
这个只读文件包含随机字符串一样。每次都会重新读。请参阅:/proc/sys/kernel/random/boot_id。
fs.inode-nr = 1495846 363644
表示inode数,前面表示使用的inode,后一个表示未使用的inode
fs.inode-state = 1495846 363644 0 0 0 0 0
保存了三个值,前两个分别表示 已分配inode数和空闲inode数。第三个是已超出系统最大inode值的数量,此时系统需要清除排查inode列表
fs.file-nr = 3552 0 6553600
此文件中保存了三个值,分别是:系统中已分配的文件句柄数量,已分配但没有使用的文件句柄数量,最大的文件句柄号
fs.dentry-state = 1182291 1062362 45 0 0 0
保存目录缓存的状态,保存有六个值,只有前三个有效
nr_dentry:当前已经分配的目录项数量;nr_unused:还没有使用的目录项数量;age_limit:当内存紧缺时,延迟多少秒后会回收目录项所占内存
vm.max_map_count = 65530
文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量
21./dev/random
Linux内核中的是第一个以背景噪声产生真正的随机数产生的实现,它允许程序访问来自设备驱动程序或其它来源的背景噪声。
1994年,美国程序员曹子德(Theodore Y. Ts\'o)第一次在Linux内核中实现了随机数发生器。使用了SHA-1散列算法而非密码,以避开法律限制。另一个原因是任意给定的散列或密码加密强度弱,而新随机数发生器在提高了密码强度。
发生器有一个容纳噪声数据的熵池,在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,直到收集到了足够的环境噪声为止。这样的设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。
/dev/random的一个副本是/dev/urandom(“unblocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
/dev/random也允许写入,任何用户都可以向熵池中加入随机数据。即使写入非随机数据亦是无害的,因为只有管理员可以调用ioctl以增加熵池大小。Linux内核中当前熵的值和大小可以通过访问/proc/sys/kernel/random/文件夹中的文件得到。
2006年3月,Gutterman、Pinkas和Reinman发表了对Linux随机数发生器的详细密码学分析,其中提出了该发生器的几个弱点。也许其中最严重的问题发生在嵌入式系统和Live CD系统,类似路由器和无盘工作站中的应用。在这些系统中,引导状态是可预测的,且环境熵的来源也较为受限。对于有NVRAM的系统,他们建议在关机时保存一部分随机数发生器的状态,使得在下次开机时可以恢复这些状态。对于路由器而言,网络数据是熵的主要来源,他们认为在重启前后保存和恢复数据可能要求潜在的攻击者要么窃听从路由器投入使用开始全部的网络信息,或直接获取路由器的内部状态。他们写道,这个问题对于无线路由器而言尤其关键,因为其网络信息可以远程获取到,并可能用于产生数据加密用密钥的随机发生器。
###查看随机数熵池大小
cat /proc/sys/kernel/random/poolsize
###查看当前随机数熵值
cat /proc/sys/kernel/random/entropy_avail
###测试,熵值变动
cat /dev/random > /dev/null & #将随机数导入空洞
cat /proc/sys/kernel/random/entropy_avail #查看当前随机数熵,降到很低的值,如果系统熵池无法供应,则会降到0,影响依托于随机数产生的服务
###增加熵池
运行 Haveged。Haveged 是一个守护进程,它使用处理器的“抖动”将熵添加到系统熵池中
安装:
yum -y install haveged.x86_64
yum -y install haveged-devel
systemctl start haveged && systemctl status haveged && systemctl enable haveged
###使用随机数后,查看熵流量情况
pv /dev/random > /dev/null
22.openGL
OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。
OpenGL的高效实现(利用了图形加速硬件)存在于Windows,部分UNIX平台和Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。
OpenGL规范由1992年成立的OpenGL架构评审委员会(ARB)维护。ARB由一些对创建一个统一的、普遍可用的API特别感兴趣的公司组成。根据OpenGL官方网站,2002年6月的ARB投票成员包括3Dlabs、Apple Computer、ATI Technologies、Dell Computer、Evans & Sutherland、Hewlett-Packard、IBM、Intel、Matrox、NVIDIA、SGI和Sun Microsystems,Microsoft曾是创立成员之一,但已于2003年3月退出。
23.cgroup driver设置为cgroupfs和systemd的区别
Cgroup,全称Control Group(控制组),是Linux系统内核提供的一个特性(Linux 2.6.24内核开始将Cgroup加入主线),主要用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS。可控制的资源主要包括CPU、内存、block I/O、网络带宽等等。
--什么是Cgroupfs:
Cgroup提供了一个原生接口并通过cgroupfs提供(从这句话我们可以知道cgroupfs就是Cgroup的一个接口的封装)。类似于procfs和sysfs,是一种虚拟文件系统。并且cgroupfs是可以挂载的,默认情况下挂载在/sys/fs/cgroup目录。
可以看到这里有很多控制文件,其中以cpuset开头的控制文件都是cpuset子系统产生的,其他文件则由Cgroup产生。tasks文件记录了这个Cgroup的所有进程(包括线程),在系统启动后默认没有对Cgroup做任何配置的情况下,cgroupfs只有一个根目录,并且系统所有的进程都在这个根目录中,即所有进程pid都在根目录的tasks文件中
--Cgroupfs限制CPU、内存的简单操作方法:
#创建Cgrou,通过mkdir创建一个新的目录,也就是常见了一个新的Cgroup
mkdir /sys/fs/cgroup/cpuset/demo
#配置Cgrou,配置这个Cgroup的资源配额,通过以下命令,可以先哲这个Cgroup的进程只能在0号cpu上运行,并且只能在0号内存节点分配内存。
echo 0 > /sys/fs/cgroup/cpuset/demo/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/demo/cpuset.mems
#使能Cgroup,通过将进程id写进tasks文件,将整个进程移动到Cgroup中,Cgroup真正起作用了
echo
--什么是Systemd:
Systemd也是对于Cgroup接口的一个封装。systemd以PID1的形式在系统启动的时候运行,并提供了一套系统管理守护程序、库和实用程序,用来控制、管理Linux计算机操作系统资源。通过systemd-cgls命令我们可以看到systemd工作的进程PID是1,而目录/sys/fs/cgroup/systemd是systemd维护的自己使用的非subsystem的cgroups层级结构。
--Systemd限制CPU、内存的简单操作方法:
#限制计划任务的CPU占用为0.1个CPU,内存为200MB
systemctl set-property cron.service CPUShares=100 MemoryLimit=200M
--总结说明
从以上的[Cgroupfs限制CPU、内存参考操作方法]及[Systemd限制CPU、内存参考操作方法]来看,相对来说Systemd更加简单,而且目前已经被主流Linux发行版所支持(Red Hat系列、Debian系列等),而且经过几个版本的迭代已经很成熟了,所以不管是Docker本身还是在K8S中建议使用Systemd来进行资源控制与管理,详细设置可以参考官方教程。
更多的关于Cgroup的资源管理,可以参考Red Hat 7的管理文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/index
24.不可屏蔽中断
不可屏蔽中断属于中断请求的一种。外部不可屏蔽中断请求经由专门的CPU针脚NMI,通知CPU发生了灾难性事件,如电源掉电、总线奇偶位出错等。内部不可屏蔽中断请求是CPU内部自发产生的,如存储器读写出错、溢出中断、除法出错中断等。NMI线上中断请求是不可屏蔽的(既无法禁止的)、而且立即被CPU锁存。因此NMI是边沿触发,不需要电平触发。NMI的优先级也比INTR高。不可屏蔽中断的类型指定为2,在CPU响应NMI时,不必由中断源提供中断类型码,因此NMI响应也不需要执行总线周期INTA。
内部不可屏蔽中断是通过软件调用的中断以及由执行指令过程中产生的“异常”。包括溢出中断、除法出错中断、INT n 指令中断以及单字节 INT 3 指令中断。不可屏蔽中断从源头分,既可由 CPU 内部产生,也可由外部 NMI 针脚产生。
---不可中断
内部不可屏蔽中断是通过软件调用的中断以及由执行指令过程中产生的“异常”。包括溢出中断、除法出错中断、INT n 指令中断以及单字节 INT 3 指令中断。不可屏蔽中断从源头分,既可由 CPU 内部产生,也可由外部 NMI 针脚产生。
---溢出中断
如果上一条指令使标志寄存器(Flags Register)中的溢出标志(Overflow Flag)置 1 ,那么在执行溢出中断指令(INTO)时,立即产生一个 4 型中断(中断类型码为 4 )。
---除法中断
在执行除法指令 DIV 或 IDIV 后,如果商大于规定的目标操作数(即目标寄存器所能表达的范围),则 CPU 立即产生一个 0 型中断。
---n指令中断
8086/8088 的指令系统中有一条 INT 指令,当执行完这条指令后就立即产生中断。编在该指令中的中断类型码 n 告诉 CPU 调用哪个服务程序来处理这个中断。
---断点中断
断点(Breakpoint Interrupt)中断即单字节 INT 3指令中断,中断类型码为 3,3型中断是专供断点用的,断点一般可以处于程序的任何位置,在断点处,停止正常执行过程,以使执行某种类型的特殊处理。通常,在调试时把断点插入程序的关键之处,以便显示寄存器、储存单元的内容。
25.可屏蔽中断INTR
INTR接受可屏蔽中断请求。输入,电平触发,高电平有效。在8086中,标志寄存器EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。
外部硬件在通过INTR发出中断请求信号的同时,还要向处理器给出一个8位的中断向量。处理器在 响应可屏蔽中断请求时,读取这个由外部硬件给出的中断向量号。处理器对这个中断向量号并没有 规定。但在具体的微机系统中,系统必须通过软件和硬件的配合设置,使得给出的这个中断向量号 不仅与外部中断源对应,而且要避免中断向量号使用冲突情况的出现。可编程中断控制器芯片8259A可 配合80386工作,能够根据设置向处理器提供上述中断向量号,还能处理中断请求的优先级。每 个8259A芯片可以支持8路中断请求信号,如果使用9个8259A芯片(一个主片,8个从片),就可使80386在 单个引脚INTR上接受多达64个中断源的中断请求信号。
处理器不屏蔽来自NMI的中断请求。处理器在响应NMI中断时,不从外部硬件接收中断向量号。与8086/8088一样,在80386中,不可屏蔽中断所对应的中断向量号固定为2。为了不可屏蔽中断的 嵌套,每当接受一个NMI中断,处理器就在内部屏蔽了再次响应NMI,这一屏蔽过程直到执行中断返回指令IRET后才结束。所以,NMI处理程序应以IRET指令结束。
26.时钟中断
在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。
27.关于硬件时钟和软件时钟
---1.时钟硬件
大部分PC中有两个时钟源,他们分别叫做RTC和OS(操作从系统)时钟。RTC(实时时钟)也叫做CMOS时钟,它是PC主机板上的一块芯片(或者叫作实时时钟电路),它靠电池供电,即系统供电,也可以维持时间和日期。由于它独立与操作系统,所以也被称之为硬件时钟,它为整个计算机提供计时标准,是最原始最底层的时钟数据。
OS时钟产生与PC主板上的定时/计数芯片,由操作系统控制这个芯片的工作,OS时钟基本单位就是该芯片的计数周期。在开机时,操作系统取得RTC中的时间数据来初始化OS时钟,然后通过计数芯片的向下计数形成了OS时钟,所以OS时钟不是本质意义上的时钟,它更应该被称为一个计数器。OS时钟只在开机时有效,而且完全由操作系统控制,所以也被称为软时钟或系统时钟。
---2.时钟原型机制
不同的操作系统,RTC和OS时钟的关系是不同的。RTC是OS时钟的时间基准,操作系统通过RTC来初始化OS时钟,此后两者保持同步运行,共同维持着系统时间。所谓同步,是指操作系统在运行过程中,每隔一个人固定时间会刷新或校正RTC种的信息。
可以看到,RTC处于最底层,提供原始的时钟数据。OS时钟建立在RTC之上,初始化完成后将完全由操作系统控制,和RTC脱离关系。操作系统通过OS时钟提供给应用程序所有的时间有关的服务。因为OS时钟完全是一个软件问题,其所表达的时间由操作系统的设计者决定,将OS时钟符定义为整形还是长整形或者大到超乎想象都是由设计者决定。
28.进程和线程
https://www.cnblogs.com/qianqiannian/p/7010909.html
29.内核级线程
内核级线程,是指由内核管理的线程。用户应用程序通过API和系统调用(system call)来访问线程工具。
线程通常被定义为一个进程中代码的不同执行路线,一个进程可包含多个线程。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级线程”(kernel-level treads)。
内核线程(kernel-level threads)指需要内核的参与,由内核完成线程的调度。其依赖于操作系统核心,由内核的内部需求进行创建和撤销。内核线程的线程表(thread table)位于内核中,包括了线程控制块(TCB),一旦线程阻塞,内核会从当前或者其他进程(process)中重新选择一个线程保证程序的执行。
30.linux 内核Lockup机制浅析
---------------------------------------------------------------
https://www.cnblogs.com/jerry116/p/8799355.html
linux 内核Lockup机制浅析
---概念说明
Linux内核Lockup就是linux内核占用CPU不放,Lockup分为两种:soft lockup 和 hard lockup。soft lockup是指CPU被内核代码占据,以至于无法执行其它进程。检测soft lockup的原理是给每个CPU分配一个定时执行的内核线程[watchdog/x],如果该线程在设定的期限内没有得到执行的话就意味着发生了soft lockup,[watchdog/x]是SCHED_FIFO实时进程,优先级为最高的99,拥有优先运行的特权。
hard lockup比soft lockup更加严重,CPU不仅无法执行其它进程,而且不再响应中断。检测hard lockup的原理利用了PMU的NMI perf event,因为NMI中断是不可屏蔽的,在CPU不再响应中断的情况下仍然可以得到执行,它再去检查时钟中断的计数器hrtimer_interrupts是否在保持递增,如果停滞就意味着时钟中断未得到响应,也就是发生了hard lockup。
linux内核的代码实现在kernel/watchdog.c中,主体涉及到了3个东西:kernel线程,时钟中断,NMI中断(不可屏蔽中断)。这3个东西具有不一样的优先级,依次是kernel线程 < 时钟中断 < NMI中断。
---检测机制
Linux kernel设计了一个检测lockup的机制,称为NMI Watchdog,是利用NMI中断实现的,用NMI是因为lockup有可能发生在中断被屏蔽的状态下,这时唯一能把CPU抢下来的方法就是通过NMI,因为NMI中断是不可屏蔽的。NMI Watchdog 中包含 soft lockup detector 和 hard lockup detector,2.6之后的内核的实现方法如下。
NMI Watchdog 的触发机制包括两部分:
1. 一个高精度计时器(hrtimer),对应的中断处理例程是kernel/watchdog.c: watchdog_timer_fn(),在该例程中:
要递增计数器hrtimer_interrupts,这个计数器供hard lockup detector用于判断CPU是否响应中断;
要唤醒[watchdog/x]内核线程,该线程的任务是更新一个时间戳;
soft lock detector检查时间戳,如果超过soft lockup threshold一直未更新,说明[watchdog/x]未得到运行机会,意味着CPU被霸占,也就是发生了soft lockup。
2.基于PMU的NMI perf event,当PMU的计数器溢出时会触发NMI中断,对应的中断处理例程是 kernel/watchdog.c: watchdog_overflow_callback(),
hard lockup detector就在其中,它会检查上述hrtimer的中断次数(hrtimer_interrupts)是否在保持递增,如果停滞则表明hrtimer中断未得到响应,也就是发生了hard lockup。
---参数设定
hrtimer的周期是:softlockup_thresh/5。
在2.6内核中:
softlockup_thresh的值等于内核参数kernel.watchdog_thresh,默认60秒;
而到3.10内核中:
内核参数kernel.watchdog_thresh名称未变,但含义变成了hard lockup threshold,默认10秒;
soft lockup threshold则等于(2*kernel.watchdog_thresh),即默认20秒。
NMI perf event是基于PMU的,触发周期(hard lockup threshold)在2.6内核里是固定的60秒,不可手工调整;在3.10内核里可以手工调整,
因为直接对应着内核参数kernel.watchdog_thresh,默认值10秒。
---异常处理
检测到 lockup 之后怎么办?可以自动panic,也可输出条信息就算完了,这是可以通过内核参数来定义的:
kernel.softlockup_panic: 决定了检测到soft lockup时是否自动panic,缺省值是0;
kernel.nmi_watchdog: 定义是否开启nmi watchdog、以及hard lockup是否导致panic,该内核参数的格式是”=[panic,][nopanic,][num]”.
参考: https://www.kernel.org/doc/Documentation/lockup-watchdogs.txt
---------------------------------------------------------------
31.cgroup的介绍和使用
https://segmentfault.com/a/1190000006917884
https://www.cnblogs.com/charlieroro/p/10180827.html
32.中断相关
https://www.crifan.com/files/doc/docbook/interrupt_related/release/htmls/index.html