Go 实现了类似于 TCMalloc 的多协程内存分配(malloc)策略,并使用基于标记-清除的三色标记法进行内存垃圾回收(GC)。
TCMalloc TCMalloc( Thread-Caching Malloc)是 Google 对 C 中的 malloc() 和 C++ 中的 operator new 的自定义实现,目的是实现一套快速而且支持多线程的内存分配器。
TCMalloc 在架构上分为三层,分别是:
前端层(Front-end):包括线程缓存(Per-thread cache)和CPU缓存(Per-CPU cache),面向用户代码; 中间层(Middle-end):由传输缓存(Transfer cache)和中央空闲列表(Central free list)构成,负责回填(refill)前端层缓存,促使缓存在线程或CPU之间流动; 后端层(Back-end):由传统页堆(Legacy page heap)和大页感知页堆(Hugepage aware pageheap)构成,负责从 OS 中获取内存。 GC Go 中的 GC 策略是:基于标记-清除的三色标记法。主要包括以下过程:
栈扫描(Stack scan):扫描栈中的根对象,并开启写屏障; 标记(Mark):使用黑灰白三种颜色对对象进行染色,所有对象默认为白色。开始将根对象染为黑色,然后将根对象引用的对象染为灰色,如此一轮轮染色,直到不存在灰色对象(灰色为中间状态),那么白色的对象就是未被引用的对象。 标记结束(Mark termination):STW(stop the world),重新扫描部分全局变量和局部变量,结束标记,结束写屏障。 清除(Sweap):并发清除未标记的(白色的)对象。 参考 TCMalloc : Thread-Caching Malloc Go GC: Latency Problem Solved
proot-distro termux官方linux发行版工具,很方便,支持镜像快照,大部分发行版使用精简版本 pkg install proot-distro proot-distro list proot-distro install <alias> atilo linux发行版安装脚本,与proot-distro近似,性能略优,分为国际版及中国版,国际版支持的os更多,但同样多为精简版。
国光大佬的脚本 个人感觉比上面俩好用,但也是精简版,测试过安装lxqt。
tmoe 对新人很友好的脚本,就不需要安装命令了,使用TUI即可完成安装。
目录 1:变量的说明 PATH变量,存放的是Linux系统需要加载的应用程序的路径,输入应用程序的名称后,默认都会去PAHT下的变量去找,找不到就会报错
2:不开启进程的启动方式 source test.sh
. test.sh . ./test.sh
这三种方式,都是不开启进程的启动方式,source命令会解析sh文件中的内容,并一步步执行下去
3:开启进程的执行方式 /bin/bash test.sh
bash test.sh
sh test.sh
这三种方式都会开启一个进程,然后执行应用程序,bin/bash 和bash没有本质区别,唯一的区别就是/bin/bash 是绝对路径执行,而bash test.sh需要先到
PAHT下的路径下找到bash应用程序然后进行执行
4:补充几种命令 echo $$ 输出当前进程的ID
read str 客户端输入变量赋值给str
echo $str 输出刚客户端输出的变量
以下总结来源于:https://www.itzhai.com/articles/how-sql-works-understand-the-essence-of-tuning-by-the-execution-principle.html
1、count优化总结
count(*)不会取记录的值,与count(1)类似。执行效率对比:count(字段) < count(主键) < count(1)
2、order by优化总结
order by字段尽量使用固定长度的字段类型,因为排序字段不支持压缩;order by字段如果需要用可变长度,应尽量控制长度,道理同上;查询中尽量不用用select *,避免查询过多,导致order by的时候sort buffer内存不够导致外部排序,或者行大小超过了max_length_for_sort_data导致走了sort_key, rowid排序模式,使得产生了更多的磁盘读,影响性能;尝试给排序字段和相关条件加上联合索引,能够用到覆盖索引最佳。
3、join使用总结
join优化的目标是尽可能减少join中Nested-Loop的循环次数,所以请让小表做驱动表;关联字段尽量走索引,这样就可以用到Index Nested-Loop Join了;如果有order by,请使用驱动表的字段作为order by,否则会使用 using temporary;如果不可避免要用到BNL算法,为了减少被驱动表多次扫描导致的对Buffer Pool利用率的影响,那么可以尝试把 join_buffer_size调大;为了进一步加快BNL算法的执行效率,我们可以给关联条件加上索引,转换为BKA算法;如果加索引成本较高,那么可以通过临时表添加索引来实现;如果您使用的是MySQL 8.0.18,可以尝试使用hash join,如果是较低版本,也可以自己在程序中实现一个hash join。
4、group by 优化建议
尽量让group by走索引,能最大程度的提高效率;如果group by结果不需要排序,那么可以加上order by null,避免进行排序;如果group by的数据量很大,可以使用SQL_BIG_RESULT修饰符,提醒优化器应该使用排序算法得到group的结果。
5、DISTINCT 优化建议同group by
6、子查询 优化建议
Semijoin,半连接转换,把子查询sql自动转换为semijion;Materialization,子查询物化;EXISTS策略,in转exists;其中Semijoin只能用于IN,= ANY,或者EXISTS的子查询中,不能用于NOT IN,<> ALL,或者NOT EXISTS的子查询中。
7、Materialization(物化)
优化器使用Materialization(物化)来实现更加有效的子查询处理。物化针对非关联子查询进行优化。
物化通过把子查询结果存储为临时表(通常在内存中)来加快查询的执行速度。MySQL在第一次获取子查询结果时,会将结果物化为临时表。随后如果再次需要子查询的结果,则直接从临时表中读取。
优化器可以使用哈希索引为临时表建立索引,以使查找更加高效,并且通过索引来消除重复项,让表保持更小。
子查询物化的临时表在可能的情况下存储在内存中,如果表太大,则会退回到磁盘上进行存储。
8、子查询的优化
首先优先使用Semijoin来进行优化,消除子查询,通常选用FirstMatch策略来做表连接;如果不可以使用Semijoin进行优化,并且当前子查询是非关联子查询,则会物化子查询,避免多次查询,同时这一步的优化会遵循选用小表作为驱动表的原则,尽量走索引字段关联,分为两种执行方式:Materialize-lookup,Materialization-scan。通常会选用哈希索引为物化临时表提高检索效率;如果子查询不能物化,那就只能考虑Exists优化策略了,通过condition push down把条件下推到exists子查询中,减少子查询的结果集,从而达到优化的目的。
9、limit优化
如果查询的offset很大,避免直接使用offset,而是通过id到聚集索引中检索查找。
利用自增索引,如:select * from t30 where id > 10000 limit 10;当然,这也是会有问题的,如果id中间产生了非连续的记录,这样定位就不准确了
Official Document MySQL - Official Image | Docker Hub MySQL :: MySQL 8.0 Reference Manual :: 4.5.4 mysqldump — A Database Backup Program MySQL——mysqldump参数大全
Practice In Action Use MySQL Image [ ~ Approach I ~ ] Start MySQL Server Instance
version: '3.1' services: mysql: image: mysql:8.0 restart: unless-stopped volumes: - ./{some/path/on/your/host}/datadir /var/lib/mysql ports: - {mapping_port}: 3306 environment: MYSQL_ROOT_PASSWORD: {MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: {database} MYSQL_USER: {username} MYSQL_PASSWORD: {MYSQL_PASSWORD} docker compose -f stack.yml up/down Connect to MySQL
1. 有哪些内存池 init_cycle.pool : 用于初始化时使用,初始化后一定被释放
196 main(int argc, char *const *argv) 253 init_cycle.pool = ngx_create_pool(1024, log); 292 cycle = ngx_init_cycle(&init_cycle); cycle->pool : 伴随整个工作周期,直到 重新加载配置 conf->temp_pool : 当配置解析完后,释放 conf->pool : 等于 cycle->pool ngx_temp_pool : 30s后释放
38 ngx_cycle_t * 39 ngx_init_cycle(ngx_cycle_t *old_cycle) 40 { 69 pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); 81 cycle->pool = pool; 260 conf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, log); 269 conf.pool = pool; 767 ngx_destroy_pool(conf.temp_pool); 778 if (ngx_temp_pool == NULL) { 779 ngx_temp_pool = ngx_create_pool(128, cycle->log); 788 if (ngx_array_init(&ngx_old_cycles, ngx_temp_pool, n, 789 sizeof(ngx_cycle_t *)) 790 !
链接:https://baijiahao.baidu.com/s?id=1720859584696743484&wfr=spider&for=pc
1、常用mysql命令
2、数据库索引
主键索引 唯一索引 索引原理 索引类型 索引数量限制 3、为什么innodb使用B+Tree
4、MySQL的数据优化
5、MySQL服务器性能分析,用过命令
6、MySQL中myisam和innodb的区别
7、innodb
为什么使用B+Tree 了解多少日志 行级锁 8、视图view
9、drop、delete、truncate
10、MySQL隔离级别
11、事务的四个特性
12、in和exsits有什么区别
13、varchar()实际能存多少数据
14、mysql复制原理
15、时间函数
16、内连接、外连接、左连接、右连接
17、union、union all
18、mysql记录货币
19、通用sql函数
20、有关权限的表
21、MySQL的acid靠什么保证
linux简单操作 安装linux操作系统 B站视频推荐:https://www.bilibili.com/video/BV1HE411r7Ln?from=search&seid=3541447354937403086
linux用户管理 /etc/password文件结构 password文件存储的是用户的登录信息,每行代表一个用户,每行由7个字段组成
1.用户登录名 2.用户口令,加密的,一般显示为x或*,真实的口令存储在/etc/shadow中 3.用户的uid 4.用户的gid 即用户所属的groupid 5.描述信息 6.指定用户的主目录的绝对路径 7.用户登录系统是运行的shell程序名称 如/bin/bash
/etc/shadow文件结构 shadow文件存储的是用户的登录信息,每行代表一个用户,每行由8个字段组成
1.账号名称 2.用户密码(经过sha-512加密) 3.最近密码更改时间 4.密码再过几天可以被更改 5.密码再过几天必须被更改 6.密码过期前几天系统提醒用户(默认为一周) 7.密码过期几天后账号会被取消 8.从1970年1月1日算起,多少天后账号会失效
/etc/group文件结构 group文件存储的是GID与组名的关系,以及群组汇总包含的用户,4个字段
1.组名 2.口令,加密的,显示为x 3.gid 4.群组中包含的用户,多个用户用分号隔开
新增群组 groupadd [-option][群组名]
修改群组 groupmod [-g n][群组名] -g 修改组id -n 修改组名
删除群组 groupdel [群组名]
新增用户 useradd [-option][用户名] -d设置用户的家目录 -m如果用户家目录不存在,则自动创建家目录 -u设置用户的UID,如果不带此参数,会自动创建 -g设置用户的初始gid或组名,如果不带此参数,系统会建立和用户名相同的组或者根据配置文件自动设置 -G设置用户加入其它群组(非初始群组,/etc/group第四个字段) -s指定用户的shell, 如/bin/csh
设置用户密码 passwd [用户名] 用于设置和修改用户密码,不带用户名则是修改当前用户的密码
修改用户属性 usermod [-option][用户名] 修改用户的属性,参数与新增相同
删除用户 userdel [-option][用户名] 删除用户账号 常用参数-r:连用户home目录一起删除
用户查询相关命令 who: 查询当前登录系统的所有用户 id:查询当前用户的GID,UID finger:查询用户的属性信息
systemd 即是启动管理也是进程管理服务管理,启动时各个程序尽量并行加载,速度很快,目前大多数主流Linux发行版都已采用。
但是目前排名第一的MX-Linux默认没有使用systemd,不过可以手动选择,具体可以通过 systemd xmlinux 去google。
理由是部分mx-linux开发者认为systemd不符合unix软件设计哲学,: )
systemd启动调优即系统启动速度调优:
基本调试命令:
systemd-analyze blame 显示所有项目启动时间
systemd-analyze critical-chain 显示影响性能的启动链条(因为很多项目有启动依赖)
很多老外在论坛上上来就否定其他调优,认为只有对critical-chain的调优是有效的,这种说法太绝对,我个人经验是其他调优,
特别是对加载时间最长的调优,也是很有效的。
systemd-analyze plot > plot.xml 生成报表,可以用浏览器查看
另外ubuntu自带的systemd-genie是个相当不错的图形查看程序,manjaro的官方库里也有,可以手动下载,里面可以很清晰
的查看到系统各个服务和后台程序的情况,包括依赖关系,启动方式等等,很好用
具体操作:
systemctl mask 是比 systemctl disable 更强的disable
很多服务是可以直接disable或者mask的,例如有些程序我们不想开机运行,可以disable,然后在桌面创建快捷方式
需要用的时候手动start, 例如向日葵的后台服务,不用的时候是完全浪费cpu,而且它平常啥也不干的时候运行还挺费的。
还有network-wait-online服务,经常发现启动慢,此服务可以mask掉,但是最好先检查哪些程序依赖wait-online,
避免某些程序不能正常启动,最简单办法就是通过浏览器查看plot.xml文件,基本能一眼看出哪些程序是在wait-online后启动的,
也可以通过刚才说的systemd-genie查看哪些程序依赖wait-online,其实systemd-genie只是一个图形工具,命令行都有相应的办法查看,只不过
此图形工具用起来比较方便。
我个人经验是,很多写的不太好的软件,如果直接屏蔽wait-online那么有可能不能正常启动,这样还有别的办法加快wait-online的速度,
例如如果是有线和无线双链接,可以直接屏蔽无线 :),或者尽量使用静态IP, 避免DHCP, 这样可以大大提高wait-online速度。
system-random-seed.service启动慢: grub 内核启动参数加入random.trust_cpu=on
具体是修改/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=quiet udev.log_priority=3 console=tty3 random.trust_cpu=on
修改完后记得使用 sudo update-grub
另外:上面的console=tty3,是将系统启动消息输出到别的tty,适用于强迫症,这样系统启动就完全无显示了。
还有比较极端的加快系统启动速度的方式:可以关掉grub的主题,关掉DM的背景和用户头像,实测也能提高一点加载速度。
另外对于各种硬盘设备启动慢,有人建议关闭linux硬盘的开机检测和clean,个人建议不要这么做,因为在各种非正常关机的情况下,
linux会做检查和修复。
springboot 连接Oracle数据库报ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 处理方式 将jdbc:oracle:thin:@127.0.0.1:1522:KFPTDB 改为 jdbc:oracle:thin:@127.0.0.1:1522/KFPTDB 两种连接方式不一样