完整的集中式日志系统:
需要包含以下几个主要特:
收集-能够采集多种来源的日志数据
传输-能够稳定的把日志数据传输到中央系统
存储-如何存储日志数据
分析-可以支持 UI 分析
警告-能够提供错误报告,监控机制
一、概念:

1.1 Elasticsearch:
定义:是一个基于Lucene的搜索服务器,开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。特点:1) 分布式、零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,数据源,自动搜索负载等。2) 高性能(集群的概念):支持一主多从且扩容简易,只要cluster.name 一致且在同一个网络中就能自动加入当前集群。3) 高可用:在一个集群的多个节点中进行分布式存储,索引支持shards(分片)和复制,即使部分节点down掉,也能自动进行数据恢复和主从切换4)倒排索引
1.2 Logstash:
主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。由于Logstash是跑在JVM上面,资源消耗比较大。Logstash由input、filter和output三部分组成,input负责从数据源提取数据,filter负责解析、处理数据,output负责输出数据,每部分都有提供丰富的插件。可以非常详细的将日志转化为各种图表,为用户提供强大的数据可视化支持grok:过滤器插件是Logstash中默认可用的几个插件之一,grok过滤器插件允许你将非结构化日志数据解析为结构化和可查询的数据。
1.3 Kibana:
Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以非常详细地将日志转换为各种图表,帮助汇总、分析和搜索重要数据日志。
1.4 Filebeat隶属于Beats:
一、定义:新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。基于原先 Logstash-fowarder 的源码改造出来。换句话说:Filebeat就是新版的 Logstash-fowarder,也会是 ELK Stack 在 shipper 端的第一选择。Filebeat:ELK 协议栈的新成员,一个轻量级开源日志文件数据搜集器,基于 Logstash-Forwarder 源代码开发,是对它的替代。在需要采集日志数据的 server 上安装 Filebeat,并指定日志目录或日志文件后,Filebeat 就能读取数据,迅速发送到 Logstash 进行解析,亦或直接发送到 Elasticsearch 进行集中式存储和分析。二、目前Beats包含四种工具:Packetbeat(搜集网络流量数据)Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)Filebeat(搜集文件数据)Winlogbeat(搜集 Windows 事件日志数据)
1.5 Kafka:
数据缓冲队列,作为消息队列解耦了处理过程,同时提高了可扩展性。具有峰值处理能力,使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。1)发布和订阅记录流,类似于消息队列或企业消息传到系统;2)以容错持久的方式存储记录流;3)处理记录发生的流。
二、架构:
// 1.日志文件.log ——> logstash(日志收集) ——> elasticsearch(存储和搜索)——> kibana(可视化和生成报表)//2.以Beats 作为日志搜集器日志文件.log ——> betes(日志收集) ——> logstash(日志过滤) ——> elasticsearch(存储和搜索)——> kibana(可视化和生成报表)优点:架构解决了 Logstash 在各服务器节点上占用系统资源高的问题。Beats 和 Logstash 之间支持 SSL/TLS 加密传输,客户端和服务器双向认证,保证了通信安全。//3.引入消息队列模式:日志文件.log ——> logstash(日志收集,不处理) ——> kafka、redis、rabbitMQ ——> logstash(日志过滤) ——> elasticsearch(存储和搜索)——> kibana(可视化和生成报表)模式特点:这种架构适合于日志规模比较庞大的情况。但由于 Logstash 日志解析点和 Elasticsearch 的负荷比较重,可将他们配置为集群模式,以分担负荷。引入消息队列,均衡了网络传输,从而降低了网络闭塞,尤其是丢失数据的可能性,但依然存在 Logstash 占用系统资源过多的问题工作流程:Filebeat采集—> logstash转发到kafka—> logstash处理从kafka缓存的数据进行分析—> 输出到es—> 显示在kibana

三、linux 下搭建 ELK: (7.5.1版本)
3.1、准备工作:
一、关闭防火墙和selinux:1)systemctl stop firewalld //停止systemctl disable firewalld //禁止开机自启2)关闭selinux:(selinux是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。)临时生效:setenforce 0永久生效:# 更改setlinux级别sed -i 's/SELINUX=enforcing/\SELINUX=permissive/' /etc/selinux/config==> vim /etc/selinux/config/ --> SELINUX=enforcing[效果同上]( SELINUX参数enforcing代表打开,disabled代表关闭 )# 查看selinux状态:getenforce二、配置yum源:cd /etc/yum.repos.d/wget http://mirrors.aliyun.com/repo/Centos-7.repo三、安装kjdk:yum -y list java* //查看可安装的版本yum install -y java-1.8.0-openjdk-devel.x86_64 //安装(要选择-devel的安装,因为这个安装的是jdk,而那个不带-devel的安装完了其实是jre。)
3.2、es安装:
3.2.1.下载安装配置:
1) 下载:wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-linux-x86_64.tar.gz2)解压到指定目类下:tar -zxvd elasticsearch-7.5.1-linux-x86_64.tar.gz -C /opt/elk/3)设置JVM堆大小:vim /opt/elk/elasticsearch-7.5.1/config/jvm.options-Xms1g ----修改成 -Xms512m (由于内存不够,不设置为256m)-Xmx1g ----修改成 -Xms512m (由于内存不够,不设置为256m)#一般设置为虚拟机内存的一半,最少为2G,推荐设置为4G{ 注意:确保堆内存最小值(Xms)与最大值(Xmx)的大小相同,防止程序在运行时改变堆内存大小。堆内存大小不要超过系统内存的50% }4)创建ES数据及日志存储目录:mkdir -p /opt/elk/elasticsearch-7.5.1/data/mkdir -p /opt/elk/elasticsearch-7.5.1/logs/5)创建运行ES的普通用户,以及修改安装目录及存储目录权限:useradd esecho "123456" | passwd --stdin "es" //不设置密码,则跳过(或者:passwd es)chown -R es:es /opt/elk/elasticsearch-7.5.1/6)配置ES: vim /opt/elk/elasticsearch-7.5.1/config/elasticsearch.ymlcluster.name: elknode.name: elk01node.master: truenode.data: truecluster.initial_master_nodes: ["elk01"]path.data: /data/elasticsearch/datapath.logs: /data/elasticsearch/logsbootstrap.memory_lock: falsebootstrap.system_call_filter: falsenetwork.host: 0.0.0.0http.port: 9200#discovery.zen.ping.unicast.hosts: ["115.159.111.143","115.159.111.144"]#discovery.zen.minimum_master_nodes: 2#discovery.zen.ping_timeout: 150s#discovery.zen.fd.ping_retries: 10#client.transport.ping_timeout: 60shttp.cors.enabled: truehttp.cors.allow-origin: "*"//配置项含义:{cluster.name 集群名称,各节点配成相同的集群名称。node.name 节点名称,各节点配置不同。node.master 指示某个节点是否符合成为主节点的条件。node.data 指示节点是否为数据节点。数据节点包含并管理索引的一部分。path.data 数据存储目录。path.logs 日志存储目录。bootstrap.memory_lock 内存锁定,是否禁用交换。bootstrap.system_call_filter 系统调用过滤器。network.host 绑定节点IP。http.port 端口。path.data: ...elasticsearch-7.5.1/data #elasticsearch数据文件存放目录path.logs: .../elasticsearch-7.5.1/logs #elasticsearch日志文件存放目录discovery.zen.ping.unicast.hosts提供其他 Elasticsearch 服务节点的单点广播发现功能。discovery.zen.minimum_master_nodes集群中可工作的具有Master节点资格的最小数量,官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量。discovery.zen.ping_timeout 节点在发现过程中的等待时间。discovery.zen.fd.ping_retries 节点发现重试次数。http.cors.enabled 是否允许跨源 REST 请求,用于允许head插件访问ES。http.cors.allow-origin 允许的源地址。}
3.2.2.系统优化配置:
1)修改系统限制:vim /etc/security/limits.conf (末尾添加)* soft nofile 65536* hard nofile 65536* soft nproc 5000* hard nproc 5000root soft nproc 5000root hard nproc 5000//配置项含义:{soft xxx : 代表警告的设定,可以超过这个设定值,但是超过后会有警告。hard xxx : 代表严格的设定,不允许超过这个设定的值。nofile : 是每个进程可以打开的文件数的限制nproc : 是操作系统级别对每个用户创建的进程数的限制}2) 增加最大内存映射数(修改信号量):vim /etc/sysctl.conf#增大用户使用内存的空间(临时)sysctl -w vm.max_map_count=262144#永久vm.max_map_count=262144vm.swappiness=0#使信号量生效:sysctl -p
3.2.3.启动ES:
#放后台启动:/opt/elk/elasticsearch-7.5.1/nohup ./bin/elasticsearch &#查看启动日志tailf nohup.out#启动成功后,可以检查端口是否使用:netstat -antop|grep 9200
3.2.4 使用curl测试:
一、ES交互方式:1)curl命令:2)es-head插件:3)kibana:二、curl命令:1) 语法:curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'-H:指定内容类型,这里为josn格式的文档-X:指定请求方式<VERB>:GET,POST,PUT,DELETE 一般请求为GET、提交变更为POST、上传文件为PUT、删除操作为DELETE<PROTOCOL>:协议,一般为HTTP协议<HOST>:主机,可为主机的IP地址或Hostname<PORT>:主机端口<PATH>:路径,主机端口后的路径,如下几个路径:/_cat, /_search,/_cluster /_cat路径覆盖了大多数的信息内容,/_search为搜索所有的索引和文档类型{/index-name:指定文档的索引名称,必须小写(同一个索引名称下不允许出现两个文档类型)/type-name:指定文档的类型名称,必须小写/10:文档的ID编号}<QUERY_STRING>:查询字符串匹配规则 { pretty:人性化创建索引 }-d:指定主体内容(指定使用JSON方式来撰写上传文档)<BODY>:json格式的请求主体例子1:添加:curl -H "Content-Type:application/json" -XPOST 'http://172.17.0.8:9200/index-name/type-name/2?pretty' -d '{"name": "zhy", "age": 18, "job": "Linux", "company": "GY" } '例子2:查询:curl -XGET 'http://172.17.0.8:9200/index-name/type-name/_search?pretty'(查询index-name索引type-name文档类型的所有数据)例子3:查询:curl -XGET 'http://172.17.0.8:9200/index-name/type-name/_search?q="18"&pretty'(查询index-name索引type-name文档类型的下有value值为18的数组)注意:查看所有索引:_cat/indices
3.3、kibana安装:
3.3.1.下载安装配置:
1) 下载:wget https://artifacts.elastic.co/downloads/kibana/kibana-7.5.1-linux-x86_64.tar.gz2)解压到指定目类下:tar -zxvd kibana-7.5.1-linux-x86_64.tar.gz -C /opt/elk/3)修改配置:/opt/elk/kibana-7.5.1/config/kibana.ymlserver.port: 5601server.host: "0.0.0.0"elasticsearch.hosts: ["http://115.159.111.142:9200"] #ES主节点地址+端口i18n.locale: "zh-CN"kibana.index: ".kibana"配置项含义:{server.port #kibana服务端口,默认5601server.host #kibana主机IP地址,默认localhostelasticsearch.hosts #用来做查询的ES节点,默http://localhost:9200kibana.index #kibana在Elasticsearch中使用索引来存储保存searches, visualizations和dashboards,默认.kibana}
3.3.2.启动kibana:
#放后台启动:/opt/elk/kibana-7.5.1/nohup ./bin/kibana --allow-root &#查看启动日志tailf nohup.out#启动成功后,可以检查端口是否使用:netstat -antop|grep 5601
3.4、logstash安装:
3.4.1 下载安装配置:
1) 下载:wget https://artifacts.elastic.co/downloads/logstash/logstash-7.5.1.tar.gz2)解压到指定目类下:tar -zxvd logstash-7.5.1.tar.gz -C /opt/elk/3)修改配置:/opt/elk/logstash-7.5.1/config/logstash.conf#复制备份cp logstash-sample.conf logstash.conf#修改文件logstash.conf:(不能有中文)input {file {path => "/usr/local/nginx/logs/access.log"type => "nginx-log"codec => jsonstart_position => "beginning"}}input {file {path => "/data/admin/log/access.log"type => "admin-log"codec => plainstart_position => "beginning"}}Filters{...}output {if [type] == "nginx-log"{elasticsearch {hosts => ["http://115.159.111.142:9200"]index => "nginx-log-%{+YYYY.MM.dd}"#user => "elastic"#password => "changeme"}}if [type] == "admin-log"{elasticsearch {hosts => ["http://115.159.111.142:9200"]index => "admin-log-%{+YYYY.MM.dd}"}}}//配置解析:{1) input:start_position:指定起始读取位置,“beginning”表示从文件头开始,“end”表示从文件尾开始(类似tail -f)。sincedb_path:通常Logstash会记录每个文件已经被读取到的位置,保存在sincedb中,如果Logstash重启,那么对于同一个文件,会继续从上次记录的位置开始读取。如果想重新从头读取文件,需要删除sincedb文件,sincedb_path则是指定了该文件的路径。根据需要将其设置为“/dev/null”,即不保存位置信息。2) Filters:(数据中间处理,对数据进行操作)grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。官方提供的grok表达式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patternsmutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。drop:丢弃一部分events不进行处理。clone:拷贝 event,这个过程中也可以添加或移除字段。geoip:添加地理信息(为前台kibana图形化展示使用)例子1:grok{match => ["message","%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{GREEDYDATA:logmessage}"]}//message代表原来的日志消息,时间戳匹配成timestamp,日志等级匹配成level,剩下的信息匹配成logmessage。这样就将原有的message信息分解成了三个字段信息。例子2:mutate {add_field => {"servicename" => "testName"}remove_field => "message"remove_field => "@timestamp"remove_field => "@version"remove_field => "host"remove_field => "path"remove_field => "tags"}//其中删除的字段为logstath自己添加的字段信息,message因为已经分解为三个字段所以不再需要。添加的字段可以写定为一个字符串,相当于给日志信息做个标签名称。}
3.4.2 启动logstash:
#测试(终端输入和输出):bin/logstash -e 'input { stdin{}} output{stdout{codec => rubydebug }}'#后台启动:/opt/elk/logstash-7.5.1/nohup ./bin/logstash -f ./config/logstash.conf#查看启动日志tailf nohup.out
3.5、filebeat安装:
3.5.1 下载安装配置:
1) 下载:wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.1-linux-x86_64.tar.gz2)解压到指定目类下:tar -zxvd filebeat-7.5.1-linux-x86_64.tar.gz -C /opt/elk/3)修改配置:/opt/elk/filebeat-7.5.1/config/filebeat.yml例子:filebeat.inputs:- type: logenabled: truepaths:- /usr/local/nginx/logs/access.logtags: ["nginx-access"]fields:logtype: nginx- type: logenabled: truepaths:- /data/admin/access.logtags: ["admin-access"]fields:logtype: adminoutput.logstash:hosts: [115.159.111.142:5044]4)配置字段解析:filebeat.inputs: //6.3以前是 filebeat.prospectors:type: log //type:指定input类型,有log、stdin、redis、tcp、syslog等enable: true #表示是该log类型配置生效paths: #指定要监控的日志,目前按照Go语言的glob函数处理。#没有对配置目录做递归处理,比如配置的如果是:-/var/log/*/*.log #则只会去/var/log目录的所有子目录中寻找以".log"结尾的文件,#而不会寻找/var/log目录下以".log"结尾的文件。tags: ["nginx-access"] #列表中添加标签,用过过滤,例如:tags: ["json"] fields: #可选字段,选择额外的字段进行输出可以是标量值,元组,字典等嵌套类型默认在sub-dictionary位置recursive_glob.enabled: true { #启用全局递归模式,例如/foo/**包括/foo, /foo/*, /foo/*/* }encoding:#指定被监控的文件的编码类型,使用plain和utf-8都是可以处理中文日志的exclude_lines: ['^DBG'] #不包含匹配正则的行include_lines: ['^ERR', '^WARN'] #包含匹配正则的行harvester_buffer_size: 16384 #每个harvester在获取文件时使用的缓冲区的字节大小max_bytes: 10485760 { #单个日志消息可以拥有的最大字节数。max_bytes之后的所有字节都被丢弃而不发送。默认值为10MB (10485760) }exclude_files: ['\.gz$'] #用于匹配希望Filebeat忽略的文件的正则表达式列表ingore_older: 0 #默认为0,表示禁用,可以配置2h,2m等,注意ignore_older必须大于close_inactive的值.表示忽略超过设置值未更新的文件或者文件从来没有被harvester收集close_* #close_ *配置选项用于在特定标准或时间之后关闭harvester。关闭harvester意味着关闭文件处理程序。如果在harvester关闭后文件被更新,则在scan_frequency过后,文件将被重新拾取。但是,如果在harvester关闭时移动或删除文件,Filebeat将无法再次接收文件,并且harvester未读取的任何数据都将丢失。close_inactive #启动选项时,如果在固定时间没有被读取,将关闭文件句柄读取的最后一条日志定义为下一次读取的起始点,而不是基于文件的修改时间如果关闭的文件发生变化,一个新的harverster将在scan_frequency运行后被启动建议至少设置一个大于读取日志频率的值,配置多个prospector来实现针对不同更新速度的日志文件使用内部时间戳机制,来反映记录日志的读取,每次读取到最后一行日志时开始倒计时使用2h 5m 来表示close_rename #当选项启动,如果文件被重命名和移动,filebeat关闭文件的处理读取close_removed #当选项启动,文件被删除时,filebeat关闭文件的处理读取这个选项启动后,必须启动clean_removedclose_eof #适合只写一次日志的文件,然后filebeat关闭文件的处理读取close_timeout #当选项启动时,filebeat会给每个harvester设置预定义时间,不管这个文件是否被读取,达到设定时间后,将被关闭close_timeout 不能等于ignore_older,会导致文件更新时,不会被读取如果output一直没有输出日志事件,这个timeout是不会被启动的,至少要要有一个事件发送,然后haverter将被关闭设置0 表示不启动clean_inactived #从注册表文件中删除先前收获的文件的状态设置必须大于ignore_older+scan_frequency,以确保在文件仍在收集时没有删除任何状态配置选项有助于减小注册表文件的大小,特别是如果每天都生成大量的新文件此配置选项也可用于防止在Linux上重用inode的Filebeat问题clean_removed #启动选项后,如果文件在磁盘上找不到,将从注册表中清除filebeat如果关闭close removed 必须关闭clean removedscan_frequency #prospector检查指定用于收获的路径中的新文件的频率,默认10stail_files:#如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,而不是从文件开始处重新发送所有内容。symlinks:#符号链接选项允许Filebeat除常规文件外,可以收集符号链接。收集符号链接时,即使报告了符号链接的路径,Filebeat也会打开并读取原始文件。backoff:#backoff选项指定Filebeat如何积极地抓取新文件进行更新。默认1s,backoff选项定义Filebeat在达到EOF之后再次检查文件之间等待的时间。max_backoff:#在达到EOF之后再次检查文件之前Filebeat等待的最长时间backoff_factor:#指定backoff尝试等待时间几次,默认是2harvester_limit:#harvester_limit选项限制一个prospector并行启动的harvester数量,直接影响文件打开数filebeat.inputs:fields:app_id: query_engine_12fields_under_root #如果值为ture,那么fields存储在输出文档的顶级位置multiline.pattern #必须匹配的regexp模式multiline.negate #定义上面的模式匹配条件的动作是 否定的,默认是false假如模式匹配条件'^b',默认是false模式,表示讲按照模式匹配进行匹配 将不是以b开头的日志行进行合并如果是true,表示将不以b开头的日志行进行合并multiline.match # 指定Filebeat如何将匹配行组合成事件,在之前或者之后,取决于上面所指定的negatemultiline.max_lines #可以组合成一个事件的最大行数,超过将丢弃,默认500multiline.timeout #定义超时时间,如果开始一个新的事件在超时时间内没有发现匹配,也将发送日志,默认是5smax_procs #设置可以同时执行的最大CPU数。默认值为系统中可用的逻辑CPU的数量。name #为该filebeat指定名字,默认为主机的hostnamesetup.kibana:host: "115.159.111.142:5601"output.elasticsearch: //output配置输出的位置,比如kafka,logstash,es,redis,file等hosts: ["115.159.111.142:9200"]index: "nginx-%{+yyyy.MM.dd}"processors: (处理器配置,不是必需的)- drop_fields: #删除字段,不在kibana里面展示,默认情况kibana里面会自动展示这些beat字段fields:["beat.hostname","beat.version","source"...]#自定义index配置setup.template.name: "nginx"setup.template.pattern: "nginx-*"setup.template.overwrite: truesetup.template.enabled: true# 7.x的版本中需要禁用此索引生命周期,否则在指定es索引名字的时候会有问题setup.ilm.enabled: false
3.5.2 修改logstash配置:
input {beats {port => 5044}}output {if[fields][logtype] == "admin" {elasticsearch {hosts => ["115.159.111.142:9200"]index => "abc-admin-%{+YYYY.MM.dd}"}}if[fields][logtype] == "nginx" {elasticsearch {hosts => ["115.159.111.142:9200"]index => "abc-nginx-%{+YYYY.MM.dd}"}}}#后台启动:/opt/elk/logstash-7.5.1/nohup ./bin/logstash -f ./config/logstash.conf
3.5.3 启动filebeat:
./filebeat -e -c filebeat.yml{后台启动:nohup ./filebeat -e -c filebeat.yml -d publish &}
注意:
一、内存buff/cache占用过大(logstash或es启动不起来):
#1:释放页缓存#2:释放dentries和inodes#3:释放所有缓存echo 1 > /proc/sys/vm/drop_cachesecho 2 > /proc/sys/vm/drop_cachesecho 3 > /proc/sys/vm/drop_cache释放后free -m查看内存占用情况cache明显减少#恢复内存清理策略为不清理echo 0 > /proc/sys/vm/drop_caches
二、报错:
1.报错:BindTransportException: Failed to bind to [9300-9400]解决:针对这个错误网上各种解决办法,都是误导人的。常见的错误解决方法是把network.host改成0.0.0.0或者127.0.0.1等,还有就是改成localhost虽然能跑起来,但是外网还是不能访问的。正确的解决办法是改成云服务器的内网ip:172.17.0.8;2.报错:bootstrap checks failed(根据报错信息,修改 /etc/security/limits.conf和 /etc/sysctl.conf)解决:1)编辑 /etc/security/limits.conf,追加以下内容;* soft nofile 65536 //*代表所有用户* hard nofile 655362)编辑 /etc/sysctl.conf,追加以下内容:vm.max_map_count=655360 //具体数值看错误提示sysctl -p //保存后,启动,使之生效3.运行过程中自动killed,查看日志也没有错误。(内存不够用)解决:更改/opt/es_software/kibana-6.6.1/config/jvm.options文件,改为合适的大小即可:Xms512mXmx512m4.OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N (启动logstash报错)原因:某些软件包启动的时候默认启用 -XX:+AssumeMP导致;解决:在jvm.optipons配置文件添加 -XX:-AssumeMP
文章转载自欢乐毅城,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




