Jquery: <script src="./scripts/jquery-1.4.2.js"></script>
Html textarea:


javasciprt,先批量替换掉下划线为点号,再正则匹配出所有包含IP行里的IP,如下:


输入素材:

  elk_logstash_bj_yz_10_73_211_106
  elk_logstash_bj_yz_10_73_211_118
  elk_logstash_bj_yz_10_73_211_119


输出素材:
10.73.211.106
10.73.211.118
10.73.211.119

Jquery写法,加上IP去重:
Html触发部分:
<a href="javascript:void(0);" id=analysisIps name=analysisIps>[提取Ip地址]</a>


x509证书一般会用到三类文件,key,csr,crt。
Key是私用密钥,openssl格式,通常是rsa算法。
csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。
crt是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证。
细节:https://www.cnblogs.com/yaohong/p/7609769.html

https://jackxiang.com/post/7054/




https://www.itrus.cn/service_13.html
核心:检查数字证书后,“客户”会发送一个随机的字符串给“服务器”用私钥去加密,服务器把加密的结果返回给“客户”,“客户”用公钥解密这个返回结果,如果解密结果与之前生成的随机字符串一致,那说明对方确实是私钥的持有者,或者说对方确实是“服务器”。
【问题1】

上面的通信过程中说到,在检查完证书后,“客户”发送一个随机的字符串给“服务器”去用私钥加密,以便判断对方是否真的持有私钥。但是有一个问题,“黑客”也可以发送一个字符串给“服务器”去加密并且得到加密后的内容,这样对于“服务器”来说是不安全的,因为黑客可以发送一些简单的有规律的字符串给“服务器”加密,从而寻找加密的规律,有可能威胁到私钥的安全。所以说,“服务器”随随便便用私钥去加密一个来路不明的字符串并把结果发送给对方是不安全的。

〖解决方法〗

每次收到“客户”发来的要加密的的字符串时,“服务器”并不是真正的加密这个字符串本身,而是把这个字符串进行一个hash计算,加密这个字符串的hash值(不加密原来的字符串)后发送给“客户”,“客户”收到后解密这个hash值并自己计算字符串的hash值然后进行对比是否一致。也就是说,“服务器”不直接加密收到的字符串,而是加密这个字符串的一个hash值,这样就避免了加密那些有规律的字符串,从而降低被破解的机率。“客户”自己发送的字符串,因此它自己可以计算字符串的hash值,然后再把“服务器”发送过来的加密的hash值和自己计算的进行对比,同样也能确定对方是否是“服务器”。

对称加密算法(symmetric key algorithms)
在对称加密算法中,加密使用的密钥和解密使用的密钥是相同的。也就是说,加密和解密都是使用的同一个密钥。因此对称加密算法要保证安全性的话,密钥要做好保密,只能让使用的人知道,不能对外公开。这个和上面的公钥密码体制有所不同,公钥密码体制中加密是用公钥,解密使用私钥,而对称加密算法中,加密和解密都是使用同一个密钥,不区分公钥和私钥。
非对称加密算法(asymmetric key algorithms)
由公钥加密的内容,只能由私钥进行解密,也就是说,由公钥加密的内容,如果不知道私钥,是无法解密的。
公钥密码体制的公钥和算法都是公开的(这是为什么叫公钥密码体制的原因),私钥是保密的。大家都以使用公钥进行加密,但是只有私钥的持有者才能解密。在实际的使用中,有需要的人会生成一对公钥和私钥,把公钥发布出去给别人使用,自己保留私钥。
签名和加密
签名,签名就是在信息的后面再加上一段内容,可以证明信息没有被修改过,怎么样可以达到这个效果呢?一般是对信息做一个hash计算得到一个hash值,注意,这个过程是不可逆的,也就是说无法通过hash值得出原来的信息内容。在把信息发送出去时,把这个hash值加密后做为一个签名和信息一起发出去。 接收方在收到信息后,会重新计算信息的hash值,并和信息所附带的hash值(解密后)进行对比,如果一致,就说明信息的内容没有被修改过,因为这里hash计算可以保证不同的内容一定会得到不同的hash值,所以只要内容一被修改,根据信息内容计算的hash值就会变化。当然,不怀好意的人也可以修改信息内容的同时也修改hash值,从而让它们可以相匹配,为了防止这种情况,hash值一般都会加密后(也就是签名)再和信息一起发送,以保证这个hash值不被修改。至于如何让别人可以解密这个签名,这个过程涉及到数字证书等概念,我们后面在说到数字证书时再详细说明,这里您先只需先理解签名的这个概念。
证书包含下面的具体内容:

证书的发布机构
证书的有效期
公钥
证书所有者(Subject)
签名所使用的算法
指纹以及指纹算法

Step3是核心,如下:
step1: “客户”向服务端发送一个通信请求

“客户”->“服务器”:你好

  

step2: “服务器”向客户发送自己的数字证书。证书中有一个公钥用来加密信息,私钥由“服务器”持有

“服务器”->“客户”:你好,我是服务器,这里是我的数字证书

step3: “客户”收到“服务器”的证书后,它会去验证这个数字证书到底是不是“服务器”的,数字证书有没有什么问题,数字证书如果检查没有问题,就说明数字证书中的公钥确实是“服务器”的。检查数字证书后,“客户”会发送一个随机的字符串给“服务器”用私钥去加密,服务器把加密的结果返回给“客户”,“客户”用公钥解密这个返回结果,如果解密结果与之前生成的随机字符串一致,那说明对方确实是私钥的持有者,或者说对方确实是“服务器”。

“客户”->“服务器”:向我证明你就是服务器,这是一个随机字符串     //前面的例子中为了方便解释,用的是“你好”等内容,实际情况下一般是随机生成的一个字符串。

“服务器”->“客户”:{一个随机字符串}[私钥|RSA]



step4: 验证“服务器”的身份后,“客户”生成一个对称加密算法和密钥,用于后面的通信的加密和解密。这个对称加密算法和密钥,“客户”会用公钥加密后发送给“服务器”,别人截获了也没用,因为只有“服务器”手中有可以解密的私钥。这样,后面“服务器”和“客户”就都可以用对称加密算法来加密和解密通信内容了。

“服务器”->“客户”:{OK,已经收到你发来的对称加密算法和密钥!有什么可以帮到你的?}[密钥|对称加密算法]

“客户”->“服务器”:{我的帐号是aaa,密码是123,把我的余额的信息发给我看看}[密钥|对称加密算法]

“服务器”->“客户”:{你好,你的余额是100元}[密钥|对称加密算法]

…… //继续其它的通信

http://www.cnblogs.com/JeffreySun/archive/2010/06/24/1627247.html

一篇漫画终于让我看懂了HTTPS协议的学习笔记,来源:
https://mp.weixin.qq.com/s/WQ0MV_76t-DvtpFYv2NZqA


颁发机构机构私钥加密服务器小红的公钥Key1:
收了钱的权威颁发机构利用自己的私钥来加密小红的服务器公钥Key1。

收了钱权威机构在合成证书签名源材料内容项:
证书颁发机构是用自己私钥通过服务器网址等信息生成的一个证书签名。

给小红颁发的证书里有四样东西:
证书颁发机构、服务器网址、被机构私钥加密了的小红的服务器公钥、被机构私钥加密了的证书签名。

Client小灰:
浏览器的小灰不再得到小红的公钥,而是得到小红买的那个SSL证书,
小灰据证书颁发机构去对照找出颁发的公钥。(OS和浏览器维护的权威名称和公钥串):
1)小灰拿着机构的公钥解密出机构证书的签名。
2)小灰按自己模仿收了钱的证书机构的规则生成一个签名,并和1)的签名比对一样即证书是有效证。
3)据2)此证书有效,放心用验明正身的机构公钥解密出小红的公钥Key1,这样就很安全不怕截胡了。
4)  小灰放心的把他俩秘密聊天的对称加密密钥Key2经从证书机构公钥解密出来的Key1加密后发小红。
5)小红用自己的私钥解开得到客户端小灰的对称加密密钥Key2,于是两人开始用Key2进行加密通讯。


注意:    服务器小红用的是自己非对称加密它是一对的,包括一个公钥和私钥,把公钥给小灰加密小灰的对称加密Key2,小红收到后用她自己的私钥解密。
           而权威收钱机构用钱“收买”了OS厂商浏览器厂商,把公钥匙都放用户电脑或各终端里面了,它签名证书和小红相反,机构用它的私钥加密签名的。

附录:
           对称加密方式,并且约定一个随机生成的密钥。后续的通信中,信息发送方都使用密钥对信息加密,而信息接收方通过同样的密钥对信息解密。
           围绕对称钥匙被替换或被劫持的问题,权威机构收钱办事和非对称和对称加密技术,大点厂商也提供低安全免费SSL证书,交钱买证书安全性更高。


jackXiang@jackXsMacBook-Pro  ~/ops   master ●  brew cask install rdm
Updating Homebrew...
Error: Cask 'rdm' is unavailable: No Cask with this name exists. Did you mean one of these?
avibrazil-rdm                         keyboard-maestro                      safeincloud-password-manager          wordmark
avibrazil-rdm                         keyboard-maestro                      safeincloud-password-manager          wordmark
keeper-password-manager               orelord-mongodb                       watchguard-mobile-vpn-with-ssl
keeper-password-manager               orelord-mongodb                       watchguard-mobile-vpn-with-ssl

可以在这里下载dmg:
链接:https://pan.baidu.com/s/1IPAgiaEByU0zA8fIov930w 密码:4pwi
安装之后的节目,输入连接名,地址,以及端口号就行了,点击下面的test connection测试连接

来自:https://blog.csdn.net/qq_41140741/article/details/86593955
现象:bogon:tmp root# mkdir -p /home/xiangdong    
mkdir: /home/xiangdong: Operation not supported

目的:fFileZilla SFTP同步Linux上的家目录到Mac上。

解决办法:
sudo vim /etc/auto_master
/home                   auto_home       -nobrowse,hidefromfinder #加上#号
bogon:tmp root# sudo automount
bogon:tmp root# mkdir -p /home/xiangdong      #重启automount后就能成功创建。


Hmmm, trying to create a directory under '/home' on a Mac?

Well, Apple doesn't want you to (with good reason, automounter owns this dir, which makes it easier to do NFS mounts and such) so you shouldn't muck with it but if you really just 'have to do it', here is how you can.

Basically: Edit /etc/auto_master and remove or comment out the line that starts with "/home".

example:
sudo vim /etc/auto_master

before:

# Automounter master map
+auto_master            # Use directory service
/net                    -hosts          -nobrowse,hidefromfinder,nosuid
/home                   auto_home       -nobrowse,hidefromfinder
/Network/Servers        -fstab
/-                      -static
after:

# Automounter master map
+auto_master            # Use directory service
/net                    -hosts          -nobrowse,hidefromfinder,nosuid
#/home                   auto_home       -nobrowse,hidefromfinder
/Network/Servers        -fstab
/-                      -static
to have the change take effect without a reboot:
sudo automount

mkdir /home/test
ls -l /home/
total 0
drwxr-xr-x 3 root admin 102 Aug 10 11:33 test

NOTE: I wouldn't do anything 'important' with this directory as it's easy to forget you altered this and an upgrade will plow over this directory, removing all data. (this dir is also not included in any Time Machine backups.


来自:https://blog.csdn.net/lychao89/article/details/53667068
背景:Inode在Mac下锁屏时间长后,网络断开了,如果中午吃饭后,再回来,就断开了,出现:
2019-02-22 09:36:26 Connecting to the network...
2019-02-22 09:36:31 Beginning authentication... [xiangdong]
2019-02-22 09:36:36 You have passed the identity authentication
2019-02-22 09:36:37 Obtaining IP address...
2019-02-22 09:36:44 Current IP address is  172.20.232.65
2019-02-22 09:36:49 Start security check session...
2019-02-22 09:36:49 Security check is passed.
2019-02-22 13:00:37 Disconnecting from the network...
2019-02-22 13:00:38 disconnect for time limit
2019-02-22 13:00:43 Connection failed.

------------------------------------------------------------------------------------------------------------------
在使用TeamViewer时,mac会自动休眠导致网络断开链接无法远程的问题。
尝试了一些方法,以下方法效果显著,特此记录。

第一步:

要设定锁定输入密码的设置,进入‘系统偏好设置’‘安全性与隐私’,将选项‘进入睡眠或开始屏幕保护程序后’打勾,选‘立即’。

第二步:

到‘launchpad’中的‘其他’文件夹打开‘Automator’,或者直接到spotlight中输入定位过去(就是拿火箭筒的小机器人)


第三步:

接下来,会弹出一个窗口,选‘新建文稿’,在弹出窗口中的‘文稿类型’选择‘服务’。


第四步:

首先可以到搜索框中输‘屏幕’,所有和屏幕有关的项目就都出来了,包括我想要的‘启动屏幕保护程序’,选中拖动到右面的框里,记住,要把“‘服务’收到”这项改为‘没有输入’,然后到菜单‘文件’中选择‘存储’,输个服务的名称,比如‘屏保’。


第五步:

到‘系统偏好设置’‘键盘’‘快捷键’‘服务’ 中,找到刚刚那个服务‘屏保’,添加快捷键,最好不要和其他的冲突 。


参考地址:http://blog.csdn.net/wo2niliye/article/details/52440012
原文:https://blog.csdn.net/zww1984774346/article/details/79303563
YUM出现问题:
  File "/usr/lib/python2.7/site-packages/urlgrabber/grabber.py", line 1723, in _do_grab
    self._do_perform()
  File "/usr/lib/python2.7/site-packages/urlgrabber/grabber.py", line 1517, in _do_perform
    raise KeyboardInterrupt
KeyboardInterrupt

阅读全文
Mac系统可以新建多个桌面,我习惯开三个桌面,第一个桌面放浏览器、QQ等娱乐窗口,第二个窗口开Xcode等编程工具(不编程用Mac干啥,是吧),第三个窗口放一些笔记啊,工具什么的。

一般切换的时候,可能都知道Ctrl+ 左右方向键来切换,如果开多个桌面的话,就得连续切过来,当然,还可以打开MIssion Control来切换,可是都有点麻烦。

其实Mac可以直接用Ctrl + 数字来切换桌面的,步骤如下:
https://blog.csdn.net/win_ann/article/details/37579871

1.首先你要有多个桌面(好像是废话)。

2.打开系统偏好设置- 键盘- Mission Control(如图所示)
点击在新窗口中浏览此图片


3.有多个桌面就会出现最下面的快捷键,勾上就可以了



这样,就可以用Ctrl+ 数字键快速切换桌面了(快捷键个数随着桌面的个数增加)
主要还是放下面,放右边出现程序多后,高度不够出现左右轮显:
1)选择哪些图标显示在任务栏上.
2)打开或关闭系统图标。

=======================================
方法一:在任务栏上设置调整
1.在任务栏空白处右击鼠标键,选择点击最下方的“设置”按钮;

Win10任务栏怎么调整位置 怎么调整Win10任务栏
2.这时我们会看到任务栏选项中的“任务栏在屏幕上的位置”字样,点击方框右端的下拉按钮;

Win10任务栏怎么调整位置 怎么调整Win10任务栏
3.会有“靠左、顶部、靠右、底部”这四个选项(本经验以靠右为例),选择点击其中“靠右”按钮;

Win10任务栏怎么调整位置 怎么调整Win10任务栏
4.会发现Win10任务栏调整到右侧了,同理还可以靠左、顶部。

Win10任务栏怎么调整位置 怎么调整Win10任务栏
END

方法二:拖动任务栏来进行调整
1.也是在任务栏空白处右击鼠标键,选择点击“锁定任务栏”按钮;

Win10任务栏怎么调整位置 怎么调整Win10任务栏
2.当我们在空白处再次右击鼠标键时,会发现“锁定任务栏”前面的对号消失了,这说明了任务栏已解除锁定;

Win10任务栏怎么调整位置 怎么调整Win10任务栏
3.我们尝试这把任务栏向屏幕顶端拖动时,会发现任务栏跑到顶端去了,也可以向右向左拖动来实现对任务栏的调整。

来自:https://jingyan.baidu.com/article/3f16e00309a9492591c10312.html
右键点击系统桌面左下角的【开始】,在开始的右键菜单中点击【设置】;
在Windows 设置窗口中,我们点击:时间和语言;
在时间和语言设置窗口中,我们先点击窗口左侧的区域和语言(新版分开的:区域、语言,点语言这项),在对应的右侧窗口首选的语言下面有一项目叫:A字 中文(中华人民共和国);中点它,它下面会显示新的一点文字叫选项,进入新选项卡左侧有一个键盘,键盘下面有系统默认的,也有QQ五笔,删除掉Win10默认输入法即可。

参考自:https://jingyan.baidu.com/article/4e5b3e1905a8c391901e24f0.html
一)卸载APP:
输入下面的命令回车,PS会列出系统中所有已安装应用列表。
Get-AppxPackage -AllUsers
从列表中找到你要卸载的应用,并找到其全名称,即PackageFullName。如果你觉得太长,可以把结果复制到记事本中查找关键字。

Version                : 10.1811.3343.0
PackageFullName        : Microsoft.People_10.1811.3343.0_x64__8wekyb3d8bbwe
InstallLocation        : C:\Program Files\WindowsApps\Microsoft.People_10.1811.3343.0_x64__8wekyb3d8bbwe

卸载上面的人脉APP:
Remove-AppxPackage Microsoft.People_10.1811.3343.0_x64__8wekyb3d8bbwe


二)不在桌面右下方上显示人脉图标,从任务栏的右键上去掉:
gpedit.msc  =》“用户配置/管理模板/开始菜单和任务栏”菜单项。
在右侧的窗口中看到一个“从任务栏中删除人脉栏”的设置项。
双击该菜单项,在打开的编辑属性窗口中,我们选择已启用设置项。

三)简单从任务栏去掉:
在Windows10桌面,右键点击任务栏的空白位置,在弹出的右键菜单中,可以看到一个显示人脉按钮的菜单项,有时候会不小心点击到该菜单项,我们可以直接把其从右键菜单中删除掉。
来自:https://jingyan.baidu.com/article/36d6ed1f8cef501bcf4883ad.html
WPS热点怎么彻底关掉,电脑是否每次开启都闪烁着“wps热点”这家伙,咱们主要说下将它彻底给消除了的办法,
打开开始菜单后,直接输入:配置工具,高级-》其它选项,参考自:
https://jingyan.baidu.com/article/0f5fb0993e721f6d8334eabe.html
实践出现开机问题:CentOS7.4开机出现welcome to emergency mode
解决办法:
我是修改了VirtualBox的启动顺序,把光盘,软驱给去掉勾选就好了。
这还不够,那个Virtualbox中的虚拟介质管理里当时挂的ISO的系统盘也得删除掉。否则还是会报错的!!参考:
https://www.cnblogs.com/mawanglin2008/articles/3650552.html


个人认为是用CentOS的网上下载的ISO所导致后来出现挂载上的问题。
也就是直接干掉勾选光驱这一项只留下磁盘这一人也就好了,有的还会报:
get "ip_local_port_range: prefer different parity for start/end values" message every time we boot the system
cat /proc/sys/net/ipv4/ip_local_port_range
1024    65535
可以看到,现在定义的范围是32768-61000.

如果想修改这个范围,可以使用sysctl工具,sysctl的配置文件位于/etc/sysctl.conf 。
From:https://www.cnblogs.com/solohac/p/4154180.html
——————————————————————————————————

CentOS7.4开机出现welcome to emergency mode,报这个错误多数情况下是因为/etc/fstab文件的错误。注意一下是不是加载了外部硬盘、存储器或者是网络共享空间,在重启时没有加载上导致的。
今天使用虚拟机做实验,在系统安装完成后,优化一些选项后,就操作了挂载ISO镜像文件,系统启动后如下报错
我试想应该是挂载引起的,而且原来系统正常启动后是进入的图形界面。

果然,我通过mount /dev/cdrom/ /mnt/cdrom挂载完成后,在/etc/fstab中写入有问题,小失误就将系统搞成这样子,可以输入密码,然后进入

写入的挂载文件有问题,开机启动出现问题。
先删除这个挂载,然后重启系统,系统启动正常。
建议大家在给重要的配置文件做改动时候,先备份,如果出现问题,可以进入救援模式然后恢复原来的配置。

主要操作如下:
第一、根据提示输入root密码后登陆救援模式
第二、检查磁盘挂载信息
第三、注释掉自己增加的内容,如果确定不在使用可以删除
第四、重启OK。


来自:https://www.jb51.net/article/146928.htm
背景:去服务关,关不了,用这个可以。Win10啥都管,简直就是垃圾,不用不行。
1、打开运行,快捷键【win+R】,输入【 gpedit.msc】,点击确定



2、在打开的组策略窗口中,依次展开计算机配置>管理模板>Windows组件,选择【windows组件】中的windows Defender 防病毒程序



3、在windows Defender设置里面双击打开【关闭windows Defender 防病毒程序】,选择【已启用】,然后单击应用

来自:https://zhidao.baidu.com/question/1050100438731397459.html
问题:rm -rf /data/www/*
rm: cannot remove ‘/data/www/yum.boosh.com.cn/centos/5/x86_64/rsyslog_v8/RPMS’: Directory not empty

办法:
在linux系统中,我们有时候删除文件夹的时候,提示rm: cannot remove `dir-name’: Directory not empty,或者文件夹非空,即使使用sudo也无法删除,那是因为系统存在使用或者执行文件夹中可执行程序,我们只需要执行命令:

lsof dir-name/.fuse_hidden000bd8c100000*

which lsof
/usr/sbin/lsof

rpm -qf /usr/sbin/lsof
lsof-4.82-5.el6.x86_64

找到那些程序在使用文件夹中的文件,

然后使用

kill 命令结束进程,如:kill 2739

然后就可以删除文件夹了。

From:https://blog.csdn.net/u014001964/article/details/82291064
一)nginx的引入epoll后惊群处理:
accept() 和 epoll_wait() 调用,还存在一个惊群的问题。换句话说,当网络 I/O 事件发生时,多个进程被同时唤醒,但实际上只有一个进程来响应这个事件,其他被唤醒的进程都会重新休眠。

其中,accept() 的惊群问题,已经在 Linux 2.6 中解决了;
而 epoll 的问题,到了 Linux 4.5 ,才通过 EPOLLEXCLUSIVE 解决。
为了避免惊群问题, Nginx 在每个 worker 进程中,都增加一个了全局锁(accept_mutex)。这些 worker 进程需要首先竞争到锁,只有竞争到锁的进程,才会加入到 epoll 中,这样就确保只有一个 worker 子进程被唤醒。

简单点说:Apache动辄就会启动成百上千的进程,如果发生惊群问题的话,影响相对较大;但是对Nginx而言,一般来说,worker_processes会设置成CPU个数,所以最多也就几十个,即便发生惊群问题的话,影响相对也较小。
另:高版本的Linux中,accept不存在惊群问题,不过epoll_wait等操作还有。

  假设你养了一百只小鸡,现在你有一粒粮食,那么有两种喂食方法:
你把这粒粮食直接扔到小鸡中间,一百只小鸡一起上来抢,最终只有一只小鸡能得手,其它九十九只小鸡只能铩羽而归。这就相当于关闭了accept_mutex。
你主动抓一只小鸡过来,把这粒粮食塞到它嘴里,其它九十九只小鸡对此浑然不知,该睡觉睡觉。这就相当于激活了accept_mutex。
  可以看到此场景下,激活accept_mutex相对更好一些,让我们修改一下问题的场景,我不再只有一粒粮食,而是一盆粮食,怎么办?
此时如果仍然采用主动抓小鸡过来塞粮食的做法就太低效了,一盆粮食不知何年何月才能喂完,大家可以设想一下几十只小鸡排队等着喂食时那种翘首以盼的情景。此时更好的方法是把这盆粮食直接撒到小鸡中间,让它们自己去抢,虽然这可能会造成一定程度的混乱,但是整体的效率无疑大大增强了。
  Nginx缺省激活了accept_mutex(最新版缺省禁用),是一种保守的选择。如果关闭了它,可能会引起一定程度的惊群问题,表现为上下文切换增多(sar -w)或者负载上升,但是如果你的网站访问量比较大,为了系统的吞吐量,我还是建议大家关闭它。

链接:https://www.jianshu.com/p/129dd4320ae1

二)边缘触发和水平触发主要体现在边缘触发程序复杂还是系统承担这个复杂而用水平触发,边缘触发只通知一次,增加程序处理难度和各种异常处理:
第一种,使用非阻塞 I/O 和水平触发通知,比如使用 select 或者 poll。

根据刚才水平触发的原理,select 和 poll 需要从文件描述符列表中,找出哪些可以执行 I/O ,然后进行真正的网络 I/O 读写。由于 I/O 是非阻塞的,一个线程中就可以同时监控一批套接字的文件描述符,这样就达到了单线程处理多请求的目的。

所以,这种方式的最大优点,是对应用程序比较友好,它的 API 非常简单。

但是,应用软件使用 select 和 poll 时,需要对这些文件描述符列表进行轮询,这样,请求数多的时候就会比较耗时。并且,select 和 poll 还有一些其他的限制。

select 使用固定长度的位相量,表示文件描述符的集合,因此会有最大描述符数量的限制。比如,在 32 位系统中,默认限制是 1024。并且,在 select 内部,检查套接字状态是用轮询的方法,再加上应用软件使用时的轮询,就变成了一个 O(n^2) 的关系。

而 poll 改进了 select 的表示方法,换成了一个没有固定长度的数组,这样就没有了最大描述符数量的限制(当然还会受到系统文件描述符限制)。但应用程序在使用 poll 时,同样需要对文件描述符列表进行轮询,这样,处理耗时跟描述符数量就是 O(N) 的关系。

除此之外,应用程序每次调用 select 和 poll 时,还需要把文件描述符的集合,从用户空间传入内核空间,由内核修改后,再传出到用户空间中。这一来一回的内核空间与用户空间切换,也增加了处理成本。

有没有什么更好的方式来处理呢?答案自然是肯定的。

第二种,使用非阻塞 I/O 和边缘触发通知,比如 epoll。

既然 select 和 poll 有那么多的问题,就需要继续对其进行优化,而 epoll 就很好地解决了这些问题。

epoll 使用红黑树,在内核中管理文件描述符的集合,这样,就不需要应用程序在每次操作时都传入、传出这个集合。
epoll 使用事件驱动的机制,只关注有 I/O 事件发生的文件描述符,不需要轮询扫描整个集合。
不过要注意,epoll 是在 Linux 2.6 中才新增的功能(2.4 虽然也有,但功能不完善)。由于边缘触发只在文件描述符可读或可写事件发生时才通知,那么应用程序就需要尽可能多地执行 I/O,并要处理更多的异常事件。

第三种,使用异步 I/O(Asynchronous I/O,简称为 AIO)。在前面文件系统原理的内容中,我曾介绍过异步 I/O 与同步 I/O 的区别。异步 I/O 允许应用程序同时发起很多 I/O 操作,而不用等待这些操作完成。而在 I/O 完成后,系统会用事件通知(比如信号或者回调函数)的方式,告诉应用程序。这时,应用程序才会去查询 I/O 操作的结果。

异步 I/O 也是到了 Linux 2.6 才支持的功能,并且在很长时间里都处于不完善的状态,比如 glibc 提供的异步 I/O 库,就一直被社区诟病。同时,由于异步 I/O 跟我们的直观逻辑不太一样,想要使用的话,一定要小心设计,其使用难度比较高。

工作模型优化

了解了 I/O 模型后,请求处理的优化就比较直观了。使用 I/O 多路复用后,就可以在一个进程或线程中处理多个请求,其中,又有下面两种不同的工作模型。

第一种,主进程 + 多个 worker 子进程,这也是最常用的一种模型。这种方法的一个通用工作模式就是:

主进程执行 bind() + listen() 后,创建多个子进程;
然后,在每个子进程中,都通过 accept() 或 epoll_wait() ,来处理相同的套接字。
比如,最常用的反向代理服务器 Nginx 就是这么工作的。它也是由主进程和多个 worker 进程组成。主进程主要用来初始化套接字,并管理子进程的生命周期;而 worker 进程,则负责实际的请求处理。我画了一张图来表示这个关系。
示例五:显示每个进程的上下文切换情况(-w)
pidstat -w -p 2831









PID:进程id
Cswch/s:每秒主动任务上下文切换数量
Nvcswch/s:每秒被动任务上下文切换数量
Command:命令名

示例六:显示选择任务的线程的统计信息外的额外信息 (-t)
pidstat -t -p 2831
$pidstat -t -p 4194
Linux 4.20.3-1.el7.elrepo.x86_64 (levoo-web_php_bj_cp_101_200_228_135)   02/03/19        _x86_64_        (1 CPU)

15:51:17      UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
15:51:17        0      4194         -    0.00    0.00    0.00    0.00     0  minivtun
15:51:17        0         -      4194    0.00    0.00    0.00    0.00     0  |__minivtun


链接:https://www.jianshu.com/p/3991c0dba094
分页: 2/331 第一页 上页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 下页 最后页 [ 显示模式: 摘要 | 列表 ]