MySQL 运行的状态 重点关注以下参数 show status like 'Queries'; show status like 'Threads_connected'; show status like 'Threads_running'; show status like 'Connection_errors_max_connections'; MySQL 运行线程 show processlist 开启慢查询日志 一、参数查询 slow_query_log 开启慢查询 mysql> show variables like '%slow_query_log%'; +---------------------+--------------------------------------+ | Variable_name | Value | +---------------------+--------------------------------------+ | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/7709d56792f9-slow.log | +---------------------+--------------------------------------+ 2 rows in set (0.00 sec) set global slow_query_log=1; slow_query_log_file 慢日志存放位置 set global slow_query_log_file='/data/logs/slow-mysql.log'; long_query_time 表示1秒的SQL就记录 mysql> show variables like 'long_query_time'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.
systemd是Linux电脑操作系统之下的一套中央化系统及设置管理程序(init),包括有守护进程、程序库以及应用软件 在Unix中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识 systemctl 命令的使用 以下以 redis 为例 启动 systemctl start redis 停止 systemctl stop redis 重启 systemctl restart redis 状态 systemctl status redis 刷新服务 systemctl daemon-reload ### 设置开机启动 systemctl enable redis 自定义配置 新建 systemctl 文件 以 redis 服务为例 touch /lib/systemd/system/redis.service vim /lib/systemd/system/redis.service 配置文件 vim /lib/systemd/system/redis.service [Unit] Description=Redis After=network.target [Service] Type=forking ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecReload=/usr/local/bin/redis-server -s reload ExecStop=/usr/local/bin/redis-server -s stop PrivateTmp=true Type=simple KillMode=process Restart=on-failure RestartSec=3s [Install] WantedBy=multi-user.target [Unit] 表示这是基础信息 Description 是描述 After 是在那个服务后面启动,一般是网络服务启动后启动 [Service] 表示这里是服务信息
工欲善其事, 必先利其器 添加 Go MOD File->Settings->Go->Go Modules 填写 goproxy: GOPROXY=https://goproxy.cn,direct 结构体添加 tags File->Settings->Editor->Live Templates -> Go 复制一个 tag 新建一个 “gorm” 使用 保存时并格式代码 File->Settings->Tools->File Watchers 选择 go fmt

Gin_validator

gin 自带验证器 参考文档: https://godoc.org/gopkg.in/go-playground/validator.v8#hdr-Baked_In_Validators_and_Tags gin 是个优秀的web框架, 集大成于一身. 对于参数的验证可以进行过滤. gin是引用了 go-playground框架, 今天我们来学习一下如何使用验证器.
[TOC] 基于es 7.x版本 安装 1. 安装jdk1.8 浏览不同的es版本对java版本的要求: https://www.elastic.co/cn/support/matrix#matrix_jvm elasticsearch 7以后自带 java jdk, 无需以下安装操作. JDK1.8下载与安装 centos yum -y install java-1.8.0-openjdk-devel.x86_64 ubuntu apt-get -y install java-1.8.0-openjdk-devel.x86_64 安装完后查看java版本 java -version 2. 下载es v7.6.2 https://www.elastic.co/cn/downloads/elasticsearch 3. linux/win环境安装 目录概述 bin 执行文件目录 bin/elasticsearch.bat 双击安装(window) bin/elasticsearch (linux) 加个 -d 参数的话表示后台静默运行 config 配置目录 elasticsearch.yml es配置文件 jvm.options jdk配置文件 -Xms1g 表示使用1G内存 log4j2.properties 日志配置文件 data 数据目录 lib jar包目录 logs日志目录 modules 模块目录 plugins 插件目录 后台启动 ./bin/elasticsearch -d -p /var/elasticsearch/es.pid 启动ElaticSearch window: 双击bin/elasticsearch.bat 文件, 差不多需要1~2分钟, 注意屏幕不动, 敲个回车.
前言 平时我们做Web开发, 经常会遇到需要请求网络资源,使用http请求, 如下面代码,注释处如果没有打开话,会导致句柄泄露, 最终报: dial tcp 127.0.0.1:80: socket: too many open files 这是为什么呢? 在linux中万物皆文件, 网络请求也相当于打开一个文件.如果打开文件忘记关闭的话, 没有及时回收资源, linux有文件打开上限,可以使用ulimit -n 查看最大支持文件打开数. 如下代码会导致句柄泄露 cli := &http.Client{} req, err := http.NewRequest(http.MethodGet, "http://www.google.com", nil) if err != nil { return } resp, err := cli.Do(req) if err != nil { return } // 必须关闭, 如果我们没有写关闭resp.Body打开的句柄,就会导致句柄泄露 // defer resp.Body.Close() // data, err := ioutil.ReadAll(resp.Body) if err != nil { return } fmt.Println(string(data)) return 分析 可以使用并发工具请求你的代码, 如使用Jmeter, 然后使用lsof -p 18001 |wc -l , 18001就你程序的进程ID, 可以查看当前程序打开文件数.
Benchmark 新建测试文件 util.go文件 func GetMd5V(s string) string { h := md5.New() h.Write([]byte(s)) return hex.EncodeToString(h.Sum(nil)) } func SumMd5(s string) string { data := []byte(s) return fmt.Sprintf("%x", md5.Sum(data)) } 以_test结尾的文件, 如util_test.go func BenchmarkSumMd5(b *testing.B) { for i := 0; i < b.N; i++ { SumMd5("1") } } func BenchmarkGetMd5V(b *testing.B) { for i := 0; i < b.N; i++ { GetMd5V("1") } } 运行Benchmark函数 go test -bench="." -benchmem 输出结果 BenchmarkSumMd5-8 1719777 847 ns/op 64 B/op 3 allocs/op BenchmarkGetMd5V-8 1861362 644 ns/op 184 B/op 5 allocs/op PASS ok openapi/app/util 4.
前言 如果你的应用是一直运行的,比如 web 应用,那么可以使用 net/http/pprof 库,它能够在提供 HTTP 服务进行分析。而非一直运行的程序可以使用 runtime/pprof 库 可以先看下pprof入门 go1.10自带 go tool pprof工具 go version 查看golang版本 安装 引用包_ "net/http/pprof" 内置包的路径: net\http\pprof\pprof.go const ( PProfPort = 6060 // 端口 ) func PprofServer() { runtime.SetMutexProfileFraction(1) // 开启对锁调用的跟踪 runtime.SetBlockProfileRate(1) // 开启对阻塞操作的跟踪 go func() { err := http.ListenAndServe(fmt.Sprintf(":%d", PProfPort), nil) if err != nil { zlog.Warn().Err(err).Msg("BootPprof") } }() } func main() { PprofServer() select{} } 浏览器查看 allocs 查看内存分配详情 block 同步原语阻塞的堆栈跟踪 cmdline 当前程序运行的参数 goroutine 所有当前goroutines的堆栈跟踪 heap 活动对象的内存分配的抽样 mutex 争用互斥锁的持有者的堆栈跟踪 profile CPU配置文件, 还可以使用go tool pprof 查看某时间段的cpu情况, 并生成火焰图 go tool pprof http://localhost:6060/debug/pprof/profile?
安装 参考 https://blog.csdn.net/pengjiangchun/article/details/105419683 使用 切换成中文 新建"线程组" 配置"线程组" 设置Cookie Http请求 Http断言 填写请求的URl 填写报告 参考 https://zhuanlan.zhihu.com/p/142897766 https://blog.csdn.net/pengjiangchun/article/details/105419683
select 用于chan通道专用的控制结构 ch := make(chan bool) select { case c <- ch: fmt.Println("hello world") default: return } 使用误区 39行, return 会一直阻塞? 希望大神解释下? 答: return相当于返回,不再继续,将永远阻塞,直到主程序退出.一般用于结束这个goroutine才加上return,否则不要轻易使用. 如果return 换成break或continue就不会阻塞 package main import ( "fmt" "github.com/gin-gonic/gin" "log" "math/rand" "sync" ) type Cache struct { ch chan int } var ( _cache *Cache _once sync.Once ) func NewCache() *Cache { _once.Do(func() { _cache = &Cache{ ch: make(chan int, 10), } _cache.monitor() }) return _cache } func (c *Cache) Push(x int) { c.