前不久考虑找个靠谱的 openjdk,具体可以看这遍:https://www.kpromise.top/openjdk-what-flavour-to-choose/,当时提到了所谓的性能,为什么用所谓这个词呢,因为我真不觉得各个发行版的 openjdk 在性能上能有什么大的差别。但是,好奇嘛,最主要的是国庆 西湖人山人海,西溪湿地 估计也不例外,就连 拱墅区的 运河广场 都不少人,与其跑出去看人,还不如在家陪孩子,孩子睡着了,我也玩玩自己的,所以有了本文。
如欲评测各个发行版 openjdk 的性能,那么首先应该考虑如何 监控docker 的各项指数,比如内存,cpu等,毕竟如果裸机玩,系统被侵入的过多,事后可能不好清理,我习惯了 docker,事后直接 rm -f 即可,扯远了,我们继续今天的主题 监控 docker 的 内存、cpu 占用。
最简单的办法我想你已经想到 docker stats ,但是他不会保存数据,也没有趋势图,所以还是用 grafana 吧,接下来需要的就是 选个数据来源,比如:Prometheus、Graphite、OpenTSDB、InfluxDB 、Elasticsearch、mysql 等,但是这个数据来源必须提供 docker 的运行信息,而能监控 docker 的第三方开源项目 可能只有 cadvisor 可以选择了,最终数据库我选择了 Prometheus,对于它,我并不熟悉,选择它纯属巧合,下面我们开始部署。
这个监控系统的架构应该是 这样的,cadvisor 获取 docker 的运行情况(cpu、内存、磁盘),然后 Prometheus 将这些数据持久化,最后,grafana 从 Prometheus 获取数据并展示。换句话说,grafana 必须要能访问到 cadvisor,grafana 必须要能访问到 Prometheus,如果将来监控别的信息,比如 mysql、redis 等,那么 Prometheus 还需要能访问这些容器,于是,我想,还不如建个 网络,将他们放在一起,并把 ip 固定死,至于如何 固定死 docker container 的 ip 可以看这篇:https://www.kpromise.top/docker-static-ip-address/ 然后我们就可以监控 docker 容器了,下面是具体的步骤。
1、创建一个网络,指定 ip 范围和名称
docker network create --subnet=172.27.0.0/16 grafanaNetWork
2、启动 cadvisor 容器
docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=6100:8080 \ --detach=true \ --name=cadvisor \ --network grafanaNetWork --ip 172.27.1.10 \ google/cadvisor:latest
3、创建 volume 名字为 prometheus
docker volume create prometheus
4、启动 prometheus
docker run -p 6200:9090 --name prometheus \ -v prometheus:/etc/prometheus \ --network grafanaNetWork --ip 172.27.2.10 \ -itd prom/prometheus --config.file=/etc/prometheus/prometheus.yml
5、启动 grafana
docker run -d --name=grafana -p 6300:3000 --network grafanaNetWork --ip 172.27.3.10 -itd grafana/grafana
现在,基本搞定,没错,就这么简单,你现在可以 分别打开:http://localhost:6100、http://localhost:6200 以及 http://localhost:6300 验证下 是否OK,如果不行,欢迎留言。另外,6300 端口映射的是 grafana 他需要登录,默认的用户名密码都是 admin,登录后会要求先修改密码,之后进入主页,选择 添加数据,接着选择 Prometheus ,新页面 url 填写 http://172.27.2.10:9090 然后点击 save and test,接着,我们导入一个 dashboard,点击左侧 + 号,选择 import,新页面(http://localhost:6300/dashboard/import) 里 填入 179(对应的页面是 https://grafana.com/grafana/dashboards/179),然后在 最下面 Prometheus 里选择 Prometheus 数据库即可。
现在,grafana 和 Prometheus 是建立了联系,但是 Prometheus 和 cadvisor 还没有呢,所以在 dashboard 上你啥也看不到的。现在,我们让 Prometheus 存储 cadvisor 里的数据。
1、先查看 prometheus volume 的具体位置
docker volume inspect prometheus
我看到的是:
[ { "CreatedAt": "2019-10-03T16:02:55+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/home/android/docker/volumes/prometheus/_data", "Name": "prometheus", "Options": {}, "Scope": "local" } ]
现在,我们打开 Mountpoint 指向的文件夹,我这里是 /home/android/docker/volumes/prometheus/_data,你可能是 /var/lib/docker/volumes/prometheus/_data ,该文件夹需要 root 权限哦,在里面找到 prometheus.yml 文件,具体内容可能如下
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090']
2、现在你可以在浏览器打开: http://localhost:6200/targets ,你会看到类似 Endpoint http://localhost:9090/metrics state UP 的信息,我们现在在这个配置文件的末尾加入如下几行,注意缩进哦:
- job_name: cadvisor scrape_interval: 5s static_configs: - targets: ['172.27.1.10:8080']
这里,172.27.1.10 是 cadvisor 的 ip,8080 是 它的内部端口。然后重启 prometheus:docker restart prometheus ,之后再刷新 http://localhost:6200/targets 页面,会发现 Endpoint 里多了一个 cadvisor ,现在,我们打开 http://localhost:6300 ,dashboard 列表里点击 docker-and-host-monitoring-w-prometheus ,然后你会发现,有数据了,有图表了,至于 各个 版本 openjdk 的性能比较,请关注本博吧。我将尽早更新,不过,先放张图,剧透下:
openjdk 各个发行版 性能比较