排查 Linux 系统 CPU 100% 异常问题
1.定位高负载进程pid 首先到服务器确认服务器情况,根据具体情况进行分析。 通过观察负载平均值,以及负载评估标准(8核),可以确认服务器存在负载低于以下情况; 观察各个进程的资源使用情况,我们发现该进程id为682的进程,其中绝大多数是CPU占用 2.定位具体的异常业务 这里我们使用 pwdx 命令根据 pid 找到业务进程路径,定位到负责人和项目: 可得出结论:该进程对应的就是数据平台的网络服务。 3 定位异常线程及具体代码行 传统的方案一般是4步: 1、top oder by with P: 1040 //首先按进程负载排序找到maxLoad(pid) 2、top -Hp 进程PID: 1073 // 找到相关负载 进程PID 3、printf “0x%x ”ThreadPID: 0x431 //将ThreadPID转换为16进制,为后面的任务 jstack 日志表现出 4、jstack 进程PID | vim +/十六进制线程PID – // 例如:jstack 1040|vim +/0x431 – 但是对于线上问题定位来说,分秒必争,上面4步还是太繁琐耗时了,之前介绍过淘宝的oldratlee同学就将上面的流程封装为一个工具:show-busy-java-threads.sh,可以很方便的定位线上的创新问题: 可得出结论:这是该系统一个时间工具类方法执行的CPU占比比较高,定位到具体方法后,查看代码逻辑是否存在问题。 ※ 如果线上问题比较紧急,可以省略1、2直接执行3,这里从多角度剖析应当深入呈现一个完整的分析思路。 附上show-busy-java-threads.sh脚本:
掌握Linux的这40个命令,保你运维事半功倍!
1 删除0字节文件 2 查看进程按内存从大到小排列 3 按 CPU 利用率从大到小排列 4 打印 cache 里的URL 5 查看 http 的并发请求数及其 TCP 连接状态: 6 sed -i ‘/Root/s/no/yes/’ /etc/ssh/sshd_config sed 在这个文里 Root 的一行,匹配 Root 一行,将 no 替换成 yes。 7 如何杀掉 MySQL 进程 ps aux |grep mysql |grep -v grep |awk ‘{print $2}’ |xargs kill -9 (从中了解到awk的用途)killall -TERM mysqldkill -9 `cat /usr/local/apache2/logs/httpd.pid` 试试查杀进程PID 8 […]
MacOS下自己创建根证书和域SSL证书实现https调试
这篇文章是讲关于如何使用 OpenSSL 在本地创建一个 HTTPS 保护的开发环境,本文基于 MacOS。 创建根SSL证书 第一步是创建一个安全套接层(CA SSL)根证书。然后可以使用此根证书为可能为单个域生成的任意数量的证书签名。 CA,Catificate Authority,它的作用就是提供证书(即服务器证书,由域名、公司信息、序列号和签名信息组成)加强服务端和客户端之间信息交互的安全性,以及证书运维相关服务。 创建 root key, $ openssl genrsa -des3 -out rootCA.key 2048 这一步系统将提示您输入密码,每次使用此特定密钥生成证书时都需要输入该密码。 使用生成的密钥来创建新的根SSL证书。并将其保存为rootCA.pem。证书有效期为10年。在这一过程中,还将被提示输入其他可选信息。 $ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.pem 这是我输入的信息,仅供参考。 Country Name (2 letter code) []:CNState or Province Name (full name) []:ProvinceLocality Name (eg, city) []:CityOrganization Name (eg, […]
MacOS 下 Wireshark 抓取 Chrome HTTPS
Mac电脑配置 在Mac创建文件夹 mkdir ~/sslkeylogfie touch ~/sslkeylogfie/ssl.key vim ~/.bash_profile export SSLKEYLOGFILE=~/sslkeylogfie/ssl.key source ~/.bash_profile wrieshark 设置 启动浏览器 在终端执行命令 open -a ‘/Applications/Google Chrome.app’ https://www.baidu.com 注意!!!! 在终端执行命令之前,一定要全部退出浏览器进程!!!否则浏览器不会记录和使用设置的密钥!!!!
mitmproxy https 抓包
安装 brew install mitmproxy 执行 mitmproxy 启动, 也可用 mitmproxy -p 8888 指定端口号, 默认监听在 8080 端口。 现在就可以抓取 Http 请求了, 要抓取 Https 还得安装证书. 证书默认放在 ~/.mitmproxy/ 下面 mitmproxy-ca-cert.cer 和 mitmproxy-ca-cert.pem 是一样的,选一个安装在 Android 上就行。 手动安装依次选择 设置 -> 安全性与位置信息 -> 加密与凭证 -> 从 SD 卡安装.代理配置都一样,修改 Wifi 配置. Mac电脑需要配置端口转发,否则代理到8080端口,无法被80 、443端口捕获,设置方法如下: 常用快捷键 按键 说明 q 退出(相当于返回键,可一级一级返回) d 删除当前(黄色箭头)指向的链接 D 恢复刚才删除的请求 G 跳到最新一个请求 […]
使用 Docker 搭建 ELK 环境
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0) 本文作者: 苏洋 创建时间: 2020年05月04日 统计字数: 12679字 阅读时间: 26分钟阅读 本文链接: soulteary.com/2020/05/04/… 使用 Docker 搭建 ELK 环境 本文将聊聊如何使用 Docker 搭建 ELK (Elasticsearch、Logstash、Kibana)。 文章将分两个部分对搭建进行介绍,用于开发测试以及一般分析需求的环境,以及弹性扩容后可以用于一般生产的环境。 因为借助于方便的 Docker,完整操作时间不超过 15 分钟,如果你对 Docker 还不熟悉,可以浏览之前的文章。 写在前面 为了方便搭建,我们使用 github.com/deviantony/… 这个开源项目,这个项目维护了 ELK 技术栈最近的三个版本,也就是 7.x、6.x、5.x ,本文将使用最新版本。 用于开发测试的基础环境使用一台1c2g的虚拟机即可,当然机器资源越多我们的服务运行效率也会越高、相同时间内数据处理能力也就越大。而用于一般生产环境建议根据自己具体情况给予更多资源。 先聊聊测试环境搭建。 测试开发环境 使用 Git Clone 命令将项目下载到所需要的位置。 git […]
在 Linux 上分析二进制文件的 10 种方法
file 它的作用:帮助确定文件类型。 这将是你进行二进制分析的起点。我们每天都在与文件打交道,并非所有的文件都是可执行类型,除此之外还有各种各样的文件类型。在你开始之前,你需要了解要分析的文件类型。是二进制文件、库文件、ASCII 文本文件、视频文件、图片文件、PDF、数据文件等文件吗? file 命令将帮助你确定你所处理的文件类型。 $ file /bin/ls/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=94943a89d17e9d373b2794dcb1f7e38c95b66c86, stripped$$ file /etc/passwd/etc/passwd: ASCII text$ ldd 它的作用:打印共享对象依赖关系。 如果你已经在一个可执行的二进制文件上使用了上面的 file 命令,你肯定会看到输出中的“动态链接”信息。它是什么意思呢? 在开发软件的时候,我们尽量不要重造轮子。有一组常见的任务是大多数软件程序需要的,比如打印输出或从标准输入/打开的文件中读取等。所有这些常见的任务都被抽象成一组通用的函数,然后每个人都可以使用,而不是写出自己的变体。这些常用的函数被放在一个叫 libc 或 glibc 的库中。 如何找到可执行程序所依赖的库?这就是 ldd 命令的作用了。对动态链接的二进制文件运行该命令会显示出所有依赖库和它们的路径。 $ ldd /bin/ls linux-vdso.so.1 => (0x00007ffef5ba1000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fea9f854000) libcap.so.2 => /lib64/libcap.so.2 (0x00007fea9f64f000) libacl.so.1 => /lib64/libacl.so.1 (0x00007fea9f446000) libc.so.6 => […]
mac 安装Nginx
WHAT 本篇主要是基于Nginx在Mac上搭建自己的服务器。 我相信很多朋友肯定是第一次听到Nginx,关于它具有怎样的传奇,这儿肯定说不完也说不透. 有兴趣的朋友可以自行google或者baidu. WHY 为什么要搭建自己的服务器呢。 好处肯定多多,这儿说一条——模拟数据。 很多时候,我们在前端开发的过程中,API接口没有做好. 当我们要铺界面时,如果等待API的开发完成,无疑是件很耽误工作的事情。 还有一点,即使API完成了,我们开发完项目时,需要自测各种极限的数据。例如 约定好返回的是NSString,如果返回的是NSNumber,你会崩吗? 约定好的一个字段有返回值,突然间返回为null,你会崩吗? 约定好的label上的赋值文本是最多7个字,突然给你77个字,你会变得很丑吗? 有人问了,不是约定好了吗? 话说API也是人开发的,你写的客户端还会crash呢,就不允许人家后台出错啦??? 讲道理嘛大兄弟! HOW 复杂来说,这是件很难的事情,因为无论是Nginx,还是它所需要的准备工作,都是一个个庞然大物。搞不懂! 你需要安装Nginx,你可以自己独立装,也可以用别的包安装. 后者那推荐的是Homebrew.这也是下面我带大家一起来做的。 如果是前者,不要问我,我装了一下午,然后失败了。 简单来说,跟着我来做,几个步骤,几分钟,带你实现。 [html] view plain copy 平台:Mac 系统:10.11.1 1. 安装Homebrew 2. 安装Nginx 3. 启动Nginx 4. 配置JSON文件 5. 配置Nginx 6. 展现成果 1.安装Homebrew 打开终端,输入: [html] view plain copy ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 跟着步骤走。终端都有提示。 2.依赖Homebrew安装Nginx 依旧在终端中 [html] view plain copy brew install nginx 这个等待时间会比较长。如果你仔细看了终端的进程。你会发现你用homebrew安装是多么聪明了。其实在安装nginx之前还要帮你安装很多别的,如果你独立安装,是很费劲的。。。 3.启动Nginx 依旧在终端里,输入 […]
Websocket原理
一、websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive ,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过这样一张图理解 有交集,但是并不是全部。 另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。= 再简单来说,层级不一样。 二、Websocket是什么样的协议,具体有什么优点 首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。 HTTP的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次HTTP请求就结束了。 在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。 教练,你BB了这么多,跟Websocket有什么关系呢?_(:з」∠)_好吧,我正准备说Websocket呢。。 首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。 首先我们来看个典型的 Websocket 握手(借用Wikipedia的。。) GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com 熟悉HTTP的童鞋可能发现了,这段类似HTTP协议的握手请求中,多了几个东西。我会顺便讲解下作用。 Upgrade: websocket Connection: Upgrade 这个就是Websocket的核心了,告诉 Apache 、 Nginx 等服务器:注意啦,我发起的是Websocket协议,快点帮我找到对应的助理处理~不是那个老土的HTTP。 Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 首先, Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠窝,我要验证尼是不是真的是Websocket助理。 然后, Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~ 最后, Sec-WebSocket-Version 是告诉服务器所使用的 Websocket Draft(协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个大难题。。不过现在还好,已经定下来啦~大家都使用的一个东西~ 脱水: 服务员,我要的是13岁的噢→_→ 然后服务器会返回下列东西,表示已经接受到请求, 成功建立Websocket啦! […]
fiddler Android下https抓包全攻略
fiddler Android下https抓包全攻略 fiddler的http、https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行、支付宝、陌陌这样的APP是抓不到包的,需要一些特殊的配置,本文把fiddler Android下https抓包的详细配置都罗列出来,供大家参考。 一、普通https抓包设置 先对Fiddler进行设置: 勾选“CaptureHTTPS CONNECTs”,接着勾选“Decrypt HTTPS traffic”。同时,由于我们是通过WiFi远程连过来,所以在下面的选项框中选择“…fromremote clients only”。 如果你要监听的程序访问的HTTPS站点使用的是不可信的证书,则请接着把下面的“Ignore servercertificate errors”勾选上。 监听端口默认是8888,你可以把它设置成任何你想要的端口。勾选上“Allow remote computersto connect”。 为了减少干扰,可以去掉“Act assystem proxy on startup”。 3)设置Android设备,添加代理服务器 保证PC所在网络和Android所用的wifi是相通的。 获取PC的局域网IP地址 这里的IP是192.168.0.52。 下面来设置Android设备上的代理服务器: 打开WiFi设置页面,选择要连接的AP,并且长按,在弹出的对话框中,选择“修改网络”。 在接下来弹出的对话框中,勾选“显示高级选项”。在接下来显示的页面中,点击“代理”,选择“手动”。 代理服务器主机名设为PC的IP,代理服务器端口设为Fiddler上配置的端口8888,点”保存”。 这样就可以对普通的https抓包了。 二、过证书校验 上面的设置还不能抓像招商银行、支付宝等APP的https包,因为这些APP对https证书进行了校验,还需要将Fiddler代理服务器的证书导到Android设备上才能抓这些APP的包。 导入的过程: 打开浏览器,在地址栏中输入代理服务器的IP和端口,会看到一个Fiddler提供的页面: 点击页面中的“FiddlerRootcertificate”链接,接着系统会弹出对话框: 输入一个证书名称,然后直接点“确定”就好了。 三、使其在HttpURLConnection下正常抓包 现在招商银行还有支付宝,都可以抓包了,但是对于像陌陌这样使用HttpURLConnection进行通讯的APP还是无能为力 还需要对fiddler进行如下设置: 点击”Rules->CustomizeRules”; 在这个函数OnBeforeResponse后面添加 if (oSession.oRequest[“User-Agent”].indexOf(“Android”)> -1 && oSession.HTTPMethodIs(“CONNECT”)) {oSession.oResponse.headers[“Connection”] = “Keep-Alive”; } 如下图所示: […]