2018年7月

最简单的基于 nginx 的下载服务器

有时候, 有些地方不能从互联网下载东西, 但是可以上传一些内部的 docker image, 比如 生产环境, 一般是连不上外网的, 及时使用代理, 很有可能也不允许下载很大的东西. 这个时候, 可以做个 docker image 上传上去, 然后供生产环境使用. 下面是一个基于 nginx 的最简单 web 服务器.

需要2个文件, 里面的 mat.zip 和 那个 jdk 的 exe 是我需要下载的东西.
Dockerfile (去除下面的所有注释)

FROM alpine
RUN apk update
RUN apk --no-cache add nginx   #安装 nginx
ADD nginx.conf /etc/nginx/nginx.conf  #复制本地的配置文件
RUN mkdir -p /run/nginx  #建立 nginx pid 文件需要的文件夹
ADD mat.zip /usr/share/nginx/www/  #复制本地需要复制的文件1 例子
ADD jdk-8u171-windows-x64.exe /usr/share/nginx/www/  #复制本地需要复制的文件2 例子
RUN chmod 755 /usr/share/nginx/www/*  #更改文件读权限
EXPOSE 80  #暴露80端口
CMD ["nginx", "-g", "daemon off;"]  #启动 nginx

nginx.conf

events {
  worker_connections 1024;
}

http {
  include /etc/nginx/mime.types;
  index index.html;
  default_type application/octet-stream;
  sendfile     on;

  server {
    location / {
      root /usr/share/nginx/www;
      index not_a_file;
      autoindex on;
      types {}
    }
  }
}

打包: docker build -t repo.tianxiaohui.com/xiatian/test:0.1 .
上传: docker push repo.tianxiaohui.com/xiatian/test:0.1
下载: docker pull repo.tianxiaohui.com/xiatian/test:0.1
运行: docker run -p 9191:80 repo.tianxiaohui.com/xiatian/test:0.1
使用: http://container.tianxiaophui.com:9191/

JVM 常见的启动参数 flags

//jit 编译器类型

  • -client //32位 client, 启动早, 编译不耗时
  • -server //32位 server, 启动晚, 编译耗时, 最终代码更优化,更快
  • -d64 //64位
  • -XX: TieredCompilation //必须使用 server 编译器, 先 client, 再 server 重新编译
  • -XX:InitialCodeCacheSize=N //初始 code cache 值, 可以通过 jconsole 查看
  • -XX:ReservedCodeCacheSize=N //最大 code cache 值

//编译开始的 threshold, 不是全局累加计数, 而是移动区间计数

  • -XX:PrintComplilation //打印编译日志 可以通过 jstat 查看编译的统计信息或 jconsole
  • -XX:CompileThreshold=N //是否启动编译的 threshold (方法调用计数器 循环回边计数器)
  • -XX:OnStackReplacePercentage=N //OSR 的 threshold 值, 需要通过公式计算次数
  • -XX:CICompilerCount=N //编译器的线程数
  • -XX:Printflagsfinal 启动时打印所有标志 flags;
  • -XX:+Inline //内联 默认是 true
  • -XX:+DoEscapeAnalysis //逃逸分析 默认是 true

//GC refer: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

  • -XX:+UseSerialGC
  • -XX:+UseParallelGC
  • -XX:-UseParallelOldGC
  • -XX:+UseConcMarkSweepGC
  • -XX:+UseParNewGC
  • -XX:+UseG1GC

//GC log refer: https://dzone.com/articles/enabling-and-analysing-the-garbage-collection-log

  • -XX:+PrintGC
  • -XX:+PrintGCDetails
  • -XX:+PrintGCTimeStamps
  • -XX:+PrintGCDateStamps
  • -Xloggc:
  • -XX:+PrintGCApplicationStoppedTime
  • -XX:+PrintGCApplicationConcurrentTime
  • -XX:+UseGCLogFileRotation
  • -XX:NumberOfGCLogFiles=5
  • -XX:GCLogFileSize=2000k
  • -XX:ParallelGCThreads=N //并发启动的GC 回收线程数目
  • -XX:+DisableExplicitGC

//heap related

  • -Xms //heap start eg: -Xms3000m
  • -Xmx //heap max eg: -Xmx:4000m
  • -XX:NewRatio=N //新生代和老年代占比用比率, default 2. 新生代大小=总堆大小/(1+NewRatio)
  • -Xns //Nursery Start eg: -Xns800m
  • -XX:NewSize=N //新生代初始大小
  • -XX:MaxNewSize=N //新生代最大值
  • -XX:PermSize=N //永久带初始大小
  • -XX:MaxPermSize=N //永久带最大值
  • -XX:MetaspaceSize=N //java8 元空间初始大小
  • -XX:MaxMetaSpaceSize=N //java8 元空间最大值
  • -XX:+PrintAdaptiveSizePolicy //打印自适应策略相关信息
  • -XX:+UseAdaptiveSizePolicy //使用自适应策略. 若xms,xmn,xns固定死,则不使用

//JFR

  • -XX:UnlockCommercialFeatures
  • -XX:+flightRecorder

官方文档: https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning

作为服务器运行的 JVM 最好设置下面这些参数:

-Xms<heap size>[g|m|k] 
-Xmx<heap size>[g|m|k]
-XX:MaxMetaspaceSize=<metaspace size>[g|m|k]
-Xmn<young size>[g|m|k]

-Xloggc:"<path to log>"
-XX:+PrintGCDetails 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=10M
-XX:+PrintGCDateStamps 

-Dsun.net.inetaddr.ttl=<TTL in seconds>

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=<path to dump>`date`.hprof

jdk 自带工具集

  • jps 列出当前用户的java 进程
    jps
    jps -v
    jps -l
  • jcmd 打印 jvm 的基本类, 线程, VM等信息. 查看 GC 参数, JVM系统变量, 参数 flags, VM 参数存活时间,
    做 dump, 打开商业 feature 等. jcmd help;

jcmd pid help
jcmd pid GC.heap_dump help
jcmd pid GC.heap_dump /tmp/heap.hprof
一般支持如下操作:

VM.native_memory
GC.rotate_log
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
Thread.print
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
  • jmap 产生 heap dump, 打印 histogram 和永久带统计 permanent generation statistics;

    jmap -histo 23383
    jmap -histo:live 23383
    jmap -permstat 23383 //perm gen statistic
    jmap -dump:live,format=b,file=/tmp/heap.hprof 23383

  • jhat 读取 heap dump 进行分析,启动 web 端口, 供查看;
  • jinfo 查看 JVM 系统属性, 并可以设置某些信息, 参数等

    -flag to print the value of the named VM flag
    -flag [+|-] to enable or disable the named VM flag
    -flag = to set the named VM flag to the given value
    -flags to print VM flags
    -sysprops to print Java system properties

  • jstack 产生 thread dump, 或打印 thread 锁的情况;

    jstack -l 23383 > /tmp/thread.log //long listing. Prints additional information about locks
    jstack 23383
    jstack -F 23383 //force stack dump
    jstack -m 23383 //to print both java and native frames (mixed mode)

  • jstat JVM 监控统计信息, 如 GC, jit编译器, 类等;

    jstat -options //list options
    jstat -gccause 23383 1s 3 //for pid 23383, print gccause 3 times, interval is 1s
    jstat -printcompilation 23383 1s 3
    jstat -gcutil 23383 1s 3

  • jconsole 图形化 JVM 线程, 类, 内存, GC 等情况;
  • jvisualvm 监视 JVM 的图形工具, 抓取和分析 dump;
  • JMC JMissionControl 图形化 JFR analysis

基于 Java 的互联网应用 应该监控那些指标

  • 操作系统层面
  1. cpu 使用率;
  2. 内存使用率;
  3. 磁盘使用情况;
  4. 网络使用情况;

    • JVM 层面
  5. Jvm cpu 使用情况;
  6. gc overhead;
  7. gc count;
  8. gc 每次回收后的使用情况;
  9. jfr 的重要指标;
  10. Jvm memory available;
  11. oom error count;

    • 应用框架层面
  12. 作为 service client 调用下游时候的 成功/失败次数, 平均时间;
  13. 调用外部数据存储的 成功/失败次数, 平均时间;

    • 应用层面
  14. tps/ops;
  15. transaction time;
  16. 5xx count;
  17. 4xx count;
  18. app busy threads;
  19. app total thread count;
  20. error count;

MAC 使用 Ctrl C/V 进行复制粘贴

MAC 接了一个 win 键盘, 发现最麻烦的是 Command + C/V 和 Ctrl + C/V 之间的切换.
于是找到了这个方法: 给 win 键盘的 Ctrl + C/V/A/X 作为 Copy/Paste/All/Cut 的快捷键.

https://superuser.com/questions/28078/remap-copy-and-paste-shortcuts-on-a-mac
Go System Preference > Keyboard > keyboard shortcuts and set Application Keyboard Shortcuts > All Applications

Add shortcut
Copy ^C
Undo ^Z
Cut ^X
Paste ^V
Select All ^A

Done :)

严格按照上面的大小写.