文章目录
基操
查看公网IP
curl ifconfig.me
查看内网IP
ip addr
JAVA进程高CPU/内存排查
- 确定是哪个进程
top
有两个JAVA进程,采用下述命令判断具体是哪个java进程
ps -p <PID> -o command
日志
docker查看日志
docker滚动查看最后50行日志
k8s怎么查看关键字上下10行左右的日志
宿主机查看日志
查看前100行日志
head -n 100 filename
查看最后10行信息
tail -n 10 log4i.log
grep 查找日志某关键字上下20行
grep 查找满足多个关键字
将日志输出到新文件中
grep 'fail\|error' a.txt
查看文件大小
查看文件夹
ls -lh data/
查看具体文件
查看某关键字进程所占端口
ps aux|grep Main
查看端口被占用
netstat -anp |grep 8000
- windows端口被占用
netstat -ano |findstr "49823"
taskkill /f /t /im "11980"
解压压缩包到当前目录
sudo tar zxvf go1.17.5.linux-amd64.tar.gz
解压.GZ结尾的压缩包
gunzip xxxx.gz
VI
查看文档某处关键字
vi后,输入/+关键字
再回车,即可跳转对应关键字位置处
替换文本
vi后,输入gg
跳转开头,再输入dG
清屏,再输入:set paste
进入粘贴模式,之后insert
进入编辑模式,粘贴后,:wq
保存退出
保存/不保存修改
不保存
:q!
保存
:wq
文件
删除文件/文件夹
- 删除文件
rm -rf 文件名
- 删除文件夹
rm -rf 目录名
复制
cp -r /home/packageA/* /home/cp/packageB/
外链
SHELL学习
第一次使用shell脚本代码备份
# !/bin/sh
cd www/wwwroot/my-admin-gin
echo "开始拉取最新代码"
echo `git pull`
name="my-admin-gin"
echo "进程名: $name"
# 获取相关进程id并杀死进程
id=`ps -ef | grep "$name" | grep -v grep | awk '{print $2}'`
echo "已杀死$name进程pid:$id"
kill -9 $id
cd server/
#以后台守护进程的方式运行server端
nohup ./$name > $name.log 2>&1 &
cd ../web
echo "正在打包前端文件,耗时估计2min,请耐心等待..."
echo `npm run build`
cd ../server
#显⽰⽂件最后10⾏
cat $name.log | tail -n 15
exit 0
不相关的一些知识
-
每日一条-> https://blog.csdn.net/weixin_53601359/article/details/115553449?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165485295016782246489716%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=165485295016782246489716&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-115553449-null-null.142v13pc_search_result_control_group,157v14control&utm_term=sql%E4%BC%98%E5%8C%96&spm=1018.2226.3001.4187
查询SQL尽量不要使用select *,而是具体字段
避免在where子句中使用or来连接条件
尽量使用数值替代字符串类型
使用explain分析你SQL执行计划
索引不适合建在有大量重复数据的字段上
where中使用默认值代替null高级SQL优化
批量插入性能提升
复合索引最左特性
inner join 、left join、right join,优先使用inner join
尽量使用union all替代union -
每日一条->
fiddler实现请求转发到本地,测试神器
FiddlerObject.log(“oSession.host :”+oSession.host );
// 判断host是否为*** 并且路径是否包含***
if(oSession.host == ‘api.imbeiyu.com’){
//转发配置
oSession.host = ‘127.0.0.1:8082’;
}
if (oSession.isHTTPS) {
// 修改协议,把 https 修改为 http ,因为局域网是http,https访问不到
oSession.oRequest.headers.UriScheme = “http”
} -
每日一条 :
https://blog.csdn.net/weixin_41231928/article/details/107040880
rebase和merge区别
fiddler直接将请求转发到本地
https://blog.csdn.net/qq_30285985/article/details/124094098 场景3
nodejs
所有node进程 pm2 list
停止进程 pm2 stop
nginx
个人配置文件举例
user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
http
{
include mime.types;
#include luawaf.conf;
include proxy.conf;
default_type application/octet-stream;
server_names_hash_bucket_size 512;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 50m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_disable "MSIE [1-6]\.";
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server_tokens off;
access_log off;
#静态资源加 监听59661端口
server{
listen 59661;
server_name 82.157.137.212;
root /usr/local/company_note/;
index index.html index.htm;
}
server
{
listen 80;
server_name 82.157.137.212;
index index.html index.htm index.php;
root /www/wwwroot/my-admin-gin/web/dist;
#error_page 404 /404.html;
include enable-php.conf;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /\.
{
deny all;
}
location /api {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^/api/(.*)$ /$1 break; #重写
proxy_pass http://127.0.0.1:45627; # 设置代理服务器的协议和地址
}
access_log /www/wwwlogs/access.log;
}
include /www/server/panel/vhost/nginx/*.conf;
}
K8S
pods和services区别
services中的ClusterIP和NodePort概念
本地连接k8s集群
- 下载并使用kctcl连接工具,执行到第三步就不用再执行了,用
kctcl --version
验证下是否安装成功 ktctl connect -n loveher
本地连接k8s集群指定nameSpace,命令需在管理员权限授权的cmd中进行kubectl get po -n loveher
可以在pods中看到多个kt-connect的工具kubectl get po,svc -n friend
获取k8s集群中的pods,其中 ClusterIP为serviceIp,具体概念去上方文档翻阅
4.上方步骤完成后,就可以用ClusterIP+端口访问对应的集群内的服务了
查看pod日志
查看k8s自定义配置
kubectl get secrets -n loveher
kubectl get secrets -n loveher yidun-secrets -oyaml
上方的是base64加密过的,需要base64解密后才是原文
平时idea启动不来的bug集合
java: 找不到符号 符号: 变量 log
- https://www.cnblogs.com/cy0523/p/16292111.html
idea省电模式
- https://blog.csdn.net/weixin_45787998/article/details/108781947
Mysql实验
mysql update某一行时,其他事务能查这一行的数据吗
结论: 能,但读的是之前没改过的数据
-
表结构
-
开启一个事务a,执行更新操作
set autocommit=0;
update lock_learn set name='t' where id=1;
- 开启一个事务b,执行查询操作
select *from lock_learn where id=1;
查询结果
为什么上了写锁,别的事务还可以读操作?
因为InnoDB有MVCC机制(多版本并发控制),可以使用快照读,而不会被阻塞。
如果想在update 某行时,其他事务在读取此行时阻塞该怎么办呢?
可以在查询时加个读锁
多个线程执行插入操作为什么要比一个线程插入要快
一个线程执行插入操作时只会建立一个连接,但多个线程执行插入操作时会建立多个连接,这个过程可以通过processlist看到; 很明显建立连接的操作是由程序的第三方框架控制的,非自己
数据量插入耗时实验
MySQL安装在云服务器上,连接是在个人电脑windows上建立
单个线程插入循环插入1000条数据耗时1m多,如果连接是在云服务器本地建立的,这个过程可能会更快
但如果是批量插入的话耗时明显更少,连1s都不到,效率翻了60多倍,如果再加上多线程插入,效率还可以再翻个几倍,大概200倍是没问题的
小插曲-插入100w耗时测试
起了100个线程,每个线程只负责批量插入1w条数据,耗时统计大概5min,cpu最高彪30%,平均在10%; 之前只起了1个线程,插入1w数据,耗时14s; 理论上我开100个线程,插入100w数据也是14s才对,但结果看起来不是这样的,看来跟云服务器的硬件配置有关,及时我开00个线程,但云服务那边配置跟不上,也不行, 测试过程中MySQL的连接来到了100个,云服务器那边的监控在此
代码附带:
func main() {
// 连接数据库
// 自动迁移 schema
db.AutoMigrate(&Test{})
//统计耗时
start := time.Now()
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(1)
go insert(db,1000,10,&wg)
}
wg.Wait()
print("多线程100个线程批量插入100w条数据耗时:" + time.Since(start).String() + "")
fmt.Println("插入成功")
}
func insert(db *gorm.DB,limit int,loopOut int,wg *sync.WaitGroup){
defer wg.Done()
users:=make([]Test,limit*loopOut)
for i := 0; i < loopOut*limit; i++ {
// 批量创建记录
users[i]=Test{Name: "test", CreateTime: time.Now()}
}
db.Create(&users)
}
60w的数据量大概处理效率
MySQL在云端,表的列仅这三列,数据硬盘存储大概占用7.9mb,本地导出这些数据大概耗时24s
编程语言线程实验
配置16g,测试最大开启线程/协程数
java可以开启到4000多条(验证过的),go可以开启到100w条(未验证)
第三方的一些补充
前置相关
- 一个开放平台可以添加多个公众号,小程序,网站或APP应用,每添加一个应用,就会给一个AppID
OpenID
只跟应用关联,不同应用的用户OpenID不一样
UnionId
跟开放平台关联,同一开放平台下不同应用的用户UnionID一样;如果换了一个新的开放平台,那新开放平台下不同应用的用户UnionID则就不一样
arthas使用
- 项目中加入arthas
- 使用插件拿到watch命令,进入arthas
docker exec -it nuannuan-app-server /bin/bash
cd /opt/arthas
java -jar arthas-boot.jar
- 选择附加JAVA进程,使用完毕后记得使用
stop
还原JAVA附加类
CDN
工作原理
CDN针对动态内容的效果,如接口
CDN可能会变更用户的IP地址
CDN缓存及刷新相关问题
wps高级筛选
筛选出想要的列
此处我想要筛选出’ip属地’ 不为中国的行
之后点击确定,就行了
OllyDbg
OllyDbg转到指定地址代码行快捷键
ctrl+g
OllyDbg回到主界面
左下方点击m2
OllyDbg查看指定内存的数值
在内存查看窗口 鼠标右键->查找->地址
OllyDbg添加注释
鼠标右键,点击注释
OllyDbg跳转到注释过的地方
鼠标右键->查找->定义的注释
CE
分析经验
眼见不一定为实,需要验证
- 比如cs1.6中,界面上显示的金钱数其实并不是真正的金钱数,真正的金钱数值和显示数值是分开存储的,因此当我们找出疑似的一堆数据时,先把这堆数据锁定,看是否是真正的数值
找基址
若是存在1级或更高级偏移,如下图思路
先找到基址,再通过基址获取基址上的地址,这张图里是1级偏移,获取地址后再加上偏移量就得到真正数据的地址啦
内存区域分析
显示格式: 从上至下地址间相差32字节,从左往右以此相差4字节,上边的D1,D5是以第一行地址显示的,假设第一行地址换成 22223BDC4F1,那D1,D5就会显示为F1,F5这样的
- 22223BDC4D1-22223BDC4F1=32(DEC格式)
- D5-D1=4(DEC格式)
从区域图里也可以看到一个英文字符占一个字节,比如test1字符占据了22223BDC651-22223BDC655这段内存,用了8个字节内存