0%

环境介绍

宿主机: Ubuntu 22.04,已装好kvm
硬盘: ubuntu安装在512g ssd,两个4T机械硬盘(忍不住夕夕低价诱惑,344入了海康希捷ST4000VX000)组zpool mirror,可用空间4T,挂载到/tank目录下,打算建个3T的磁盘镜像给群晖。
群晖选的是DS918+镜像,版本DSM 6.2.3-25426

阅读全文 »

虽然NAS空载时功耗不高,挂两3.5寸机械硬盘控制在40w以内,但24小时开着也是浪费。

我现在的方案是一个树莓派24x365天开机(5w左右),树莓派通过tailscale穿透,在外需要使用NAS时,连上树莓派,通过树莓派发送magic packet开机,crontab设置凌晨自动关机。

除了在BIOS里开启Wake on lan, ubuntu也需要设置过,才能支持Wake on Lan。

阅读全文 »

家里的NAS服务器目前是1个512 SSD + 4T HDD +1T HDD,系统装的Win10, hyper-v开虚拟机。但是发现hyper-v效率不高,i5 8400处理器分了2个核,4g内存,装ubuntu空载甚至有卡顿的感觉,决定试试linux下的kvm虚拟机。

同时数据安全起见,打算用zfs on linux,4T硬盘分1个T的分区和1T硬盘组RAID1(zpool mirror模式), 重要数据放这里,非重要数据放另外的3T分区。以后1T不够用了,再买新硬盘扩容。

先在虚拟机上测试。

阅读全文 »

创建虚拟机

1
2
3
4
virt-install --name ubuntu --memory 4096 --vcpus=2 \
--os-variant ubuntu22.04 --graphics vnc,password=000000,listen=::,port=591 \
--network bridge=br0 --disk path=/home/xxx/vm/ubuntu/ubuntu.qcow2,size=30 \
--cdrom /home/xxx/iso/ubuntu-22.04.1-live-server-amd64.iso --debug

--os-variant 可用值选项查看 virt-install --osinfo list, 但ubuntu22.04不在列表里貌似也没问题

安装linux用lvm创建分区,方便后期扩容

可使用vnc viewer连接安装操作系统, 端口5911,密码000000 会持久化,一直可用,配置保存到/etc/libvirt/qemu/ubuntu.xml ,命令virsh dumpxml ubuntu可查看配置

如果是从已装好的硬盘文件导入:

1
2
3
4
virt-install --name ubuntu2 --memory 4096 --vcpus=2 \
--os-variant ubuntu22.04 --graphics vnc,password=000000,listen=::,port=5912 \
--network bridge=br0 --disk path=/home/xxx/xxx/ubuntu2/ubuntu.qcow2 \
--debug --import
阅读全文 »

分代收集理论

当前虚拟机的垃圾收集都采用分代收集理论,根据对象存活时间不同将内存分为几块。Java推分为新生代和老年代,我们根据各个年龄代不同的特性选择合适的垃圾收集算法。在新生代,每次收集都会有大量的对象(99%)死亡,可以选择复制算法,只需要付出少量对象的复制成本就可以完成垃圾收集。老年代存活率比较高,而且没有额外的空间对它进行分配担保,所以我们必须选择标记-清除或者标记-整理算法。标记清除和标记整理算会会比复制算法慢10倍以上。

阅读全文 »

加载类

我们都知道类的加载过程有加载->验证->准备->解析->初始化几个步骤,才能正式使用,当我们用new指令创建对象时,虚拟机会判断该类是否已经完成加载,如果没有,先执行上述的加载步骤,如果已经完成加载,就开始创建对象。一旦一个类加载完成,待创建对象所需的内存大小就已经确定了,为对象分配空间,等同于把一块确定大小的内存从堆里划分出来。

分配内存

划分内存方法

指针碰撞(Bump the Pointer) (默认)

如果垃圾收集器采用标记整理算法,Java堆中的内存是规整的,所有用过的内存都在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离。

空闲列表(Free List)

如果Java堆中的内存并不是规整的(标记清除算法),已使用的内存和空 闲的内存相互交错,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记 上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录.

阅读全文 »

  • -xms512m 初始堆大小512M,默认物理内存的1/64
  • -Xmx512m 最大堆大小512M,默认物理内存的1/4

初始内存跟最大内存最好相等,防止内存不够时扩充内 存或者Full GC,导致性能降低

  • -XX:+HeapDumpOnOutofMemoryError 内存异常打印dump
  • -XX:NewSize=100m 新生代初始化内存的大小(需要小于-xmx)
  • -XX:MaxNewSize=100m 是新生代可被分配的内存的最大上限
  • -Xmn100m 新生代内存100m,同时对-XX:MaxNewSize和-XX:NewSize设置,一致可以避免动态调整
  • -XX:NewRatio=2 默认2表示新生代为年老代的1/2,占整个堆内存的1/3。
  • -XX:SurvivorRatio=8 默认8表示一个survivor区占用1/8的Eden内存,即1/10的新生代内存。

以上配置可以推出老年代内存512-100=412M

  • -XX:SurvivorRatio=8 新生代内存分配比例(8:1:1,总共10,如果配6,就是6:2:2)
  • -XX:MaxMetaspaceSize=256M 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小
  • -XX:MaxMetaspaceSize=256M 指定元空间触发Full gc的初始阈值,默认是21M,达到该值就会触发 full gc进行类型卸载, 同时收集器会对该值进行调整: 如果释放了大量的空间, 就适当降低该值; 如果释放了很少的空间, 那么在不超 过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。

如果程序启动慢,观察是否在启动过程中频繁full gc,如果是,可能是程序比较大,因为Metaspace存放类的信息,很快达到了21M,频繁Full gc扩容,可以试着改大。建议MaxMetaspaceSize和MaxMetaspaceSize改成一样

  • ‐Xss1m 设置每个线程的栈大小,默认1M,通常够用,影响一个线程栈里能分配的栈帧数,太小了容易StackOverflowError

JVM优化,就是尽可能让对象都在新生代里分配和回收,尽量别 让太多对象频繁进入老年代,避免频繁对老年代进行垃圾回收,同时给系统充足的内存大小,避免新生代频繁的进行垃圾回收。没有通用的调优参数,需要根据业务场景来。

环境

操作系统: CentOS Linux release 7.6.1810

内网ip: 192.168.20.15

kubernetes: v1.15.1

docker: 19.03.1

安装docker

1
2
3
4
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
systemctl enable docker
systemctl start docker
阅读全文 »

忍不了wordpress的缓慢,没找到一个完美支持markdown,又看得上的主题,是这次迁移的原因。按官方文档迁移后,现在的效果是文章基本都没问题,但是类目,tag之类的链接全变了,所以会有很多404,但还好,反正博客访问量也不大。静态网站,速度贼快,哈哈。

编辑器,我现在用的是Visual Studio Code,图片用PicGo插件,配上阿里云oss,非常方便。部署用的是hexo-deployer-rsync插件,一条命令,打算写个小脚本,配上gitlab runner,实现提交后自动部署。