文末福利:輕量應(yīng)用服務(wù)器優(yōu)惠,新用戶專享。
java.io.IOException: 磁盤空間不足
df -h
du -sh *
ls -lh
top
TopicNewController.getTopicSoftList() error='Java heap space
From class java.lang.OutOfMemoryError'appstore_apitomcat
/data/program/jdk/bin/jmap -dump:live,format=b,file=/home/www/jmaplogs/jmap-8001-2.bin 18760
ps -ef|grep store.cn.xml|grep -v grep|awk '{print $2}'|xargs /data/program/jdk-1.8.0_11/bin/jmap -dump:live,format=b,file=api.bin
.bin.tgz---.bin.tar--.bin
java.lang.Object[810325] @ 0xb0e971e0
虛擬機(jī)棧(棧楨中的本地變量表)中的引用的對(duì)象,就是平時(shí)所指的java對(duì)象,存放在堆中。
方法區(qū)中的類靜態(tài)屬性引用的對(duì)象,一般指被static修飾引用的對(duì)象,加載類的時(shí)候就加載到內(nèi)存中。
方法區(qū)中的常量引用的對(duì)象。
本地方法棧中JNI(native方法)引用的對(duì)象。
(3)GC算法
串行只使用單條GC線程進(jìn)行處理,而并行則使用多條。
多核情況下,并行一般更有執(zhí)行效率,但是單核情況下,并行未必比串行更有效率。
STW會(huì)暫停所有應(yīng)用線程的執(zhí)行,等待GC線程完成后再繼續(xù)執(zhí)行應(yīng)用線程,從而會(huì)導(dǎo)致短時(shí)間內(nèi)應(yīng)用無響應(yīng)。
Concurrent會(huì)導(dǎo)致GC線程和應(yīng)用線程并發(fā)執(zhí)行,因此應(yīng)用線程和GC線程互相搶用CPU,從而會(huì)導(dǎo)致出現(xiàn)浮動(dòng)垃圾,同時(shí)GC時(shí)間不可控。
新生代算法都是基于Coping的,速度快。
Parallel Scavenge:吞吐量?jī)?yōu)先。
吞吐量=運(yùn)行用戶代碼時(shí)間 /(運(yùn)行用戶代碼時(shí)間 + 垃圾收集時(shí)間)
# 內(nèi)存OOM時(shí),自動(dòng)生成dump文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/
2020-09-23T01:45:05.487+0800: 126221.918: [GC (Allocation Failure) 2020-09-23T01:45:05.487+0800: 126221.918: [ParNew: 1750755K->2896K(1922432K), 0.0409026 secs] 1867906K->120367K(4019584K), 0.0412358 secs] [Times: user=0.13 sys=0.01, real=0.04 secs]
2020-10-27T20:27:57.733+0800: 639877.297: [Full GC (Heap Inspection Initiated GC) 2020-10-27T20:27:57.733+0800: 639877.297: [CMS: 165992K->120406K(524288K), 0.7776748 secs] 329034K->120406K(1004928K), [Metaspace: 178787K->178787K(1216512K)], 0.7787158 secs] [Times: user=0.71 sys=0.00, real=0.78 secs]
首先利用 printf '%x \n' 將tid換為十六進(jìn)制:xid。
再利用 jstack | grep nid=0x -A 10 查詢線程信息(若進(jìn)程無響應(yīng),則使用 jstack -f ),信息如下:
Deadlock found when trying to get lock; try restarting transaction ;
@Transactional(rollbackFor = Exception.class)
void saveOrUpdate(MeetingInfo info) {
// insert ignore into table values (...)
int result = mapper.insertIgnore(info);
if (result>0) {
return;
}
// update table set xx=xx where id = xx
mapper.update(info);
}
SQL不走索引或掃描行數(shù)過多等致使執(zhí)行時(shí)長(zhǎng)過長(zhǎng)。
SQL沒問題,只是因?yàn)槭聞?wù)并發(fā)導(dǎo)致等待鎖,致使執(zhí)行時(shí)長(zhǎng)過長(zhǎng)。
-- 當(dāng)前運(yùn)行的所有事務(wù)
select * from information_schema.innodb_trx;
-- 當(dāng)前出現(xiàn)的鎖
SELECT * FROM information_schema.INNODB_LOCKS;
-- 鎖等待的對(duì)應(yīng)關(guān)系
select * from information_schema.INNODB_LOCK_WAITS;
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`salary` int(10) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`(191)) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4;
kill 105853
通過set global max_connections=XXX增大最大連接數(shù)。
先利用show processlist獲取連接信息,然后利用kill殺死過多的連。
排序數(shù)據(jù)庫連接的數(shù)目
mysql -h127.0.0.0.1 -uabc_test -pXXXXX -P3306 -A -e 'show processlist'| awk '{print $4}'|sort|uniq -c|sort -rn|head -10
葉子節(jié)點(diǎn)data域保存了完整的數(shù)據(jù)的地址。
主鍵與數(shù)據(jù)全部存儲(chǔ)在一顆樹上。
Root節(jié)點(diǎn)常駐內(nèi)存。
每個(gè)非葉子節(jié)點(diǎn)一個(gè)innodb_page_size大小,加速磁盤IO。
磁盤的I/O要比內(nèi)存慢幾百倍,而磁盤慢的原因在于機(jī)械設(shè)備尋找磁道慢,因此采用磁盤預(yù)讀,每次讀取一個(gè)磁盤頁(page:計(jì)算機(jī)管理存儲(chǔ)器的邏輯塊-通常為4k)的整倍數(shù)。
如果沒有主鍵,MySQL默認(rèn)生成隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類型為長(zhǎng)整形。
輔助索引結(jié)構(gòu)與主索引相同,但葉子節(jié)點(diǎn)data域保存的是主鍵指針。
InnoDB以表空間Tablespace(idb文件)結(jié)構(gòu)進(jìn)行組織,每個(gè)Tablespace 包含多個(gè)Segment段。
每個(gè)段(分為2種段:葉子節(jié)點(diǎn)Segment&非葉子節(jié)點(diǎn)Segment),一個(gè)Segment段包含多個(gè)Extent。
一個(gè)Extent占用1M空間包含64個(gè)Page(每個(gè)Page 16k),InnoDB B-Tree 一個(gè)邏輯節(jié)點(diǎn)就分配一個(gè)物理Page,一個(gè)節(jié)點(diǎn)一次IO操作。
一個(gè)Page里包含很多有序數(shù)據(jù)Row行數(shù)據(jù),Row行數(shù)據(jù)中包含F(xiàn)iled屬性數(shù)據(jù)等信息。
select * from table where id = 1
select * from table where name = 'a'
show variables like 'tx_isolation';
Repeatable read不存在幻讀的問題,RR隔離級(jí)別保證對(duì)讀取到的記錄加鎖 (記錄鎖),同時(shí)保證對(duì)讀取的范圍加鎖,新的滿足查詢條件的記錄不能夠插入 (間隙鎖),不存在幻讀現(xiàn)象。
在MYSQL的事務(wù)引擎中,INNODB是使用范圍最廣的。它默認(rèn)的事務(wù)隔離級(jí)別是REPEATABLE READ(可重復(fù)讀),在標(biāo)準(zhǔn)的事務(wù)隔離級(jí)別定義下,REPEATABLE READ是不能防止幻讀產(chǎn)生的。INNODB使用了next-key locks實(shí)現(xiàn)了防止幻讀的發(fā)生。
在默認(rèn)情況下,mysql的事務(wù)隔離級(jí)別是可重復(fù)讀,并且innodb_locks_unsafe_for_binlog參數(shù)為OFF,這時(shí)默認(rèn)采用next-key locks。所謂Next-Key Locks,就是Record lock和gap lock的結(jié)合,即除了鎖住記錄本身,還要再鎖住索引之間的間隙??梢栽O(shè)置為ON,則RR隔離級(jí)別時(shí)會(huì)出現(xiàn)幻讀。
select * from table where ?;
select * from table where ? lock in share mode; 加S鎖 (共享鎖)
-- 下面的都是X鎖 (排它鎖)
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`salary` int(11) DEFAULT NULL,
KEY `IDX_ID` (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES ('10', '1s', '10');
INSERT INTO `employee` VALUES ('20', '2s', '20');
INSERT INTO `employee` VALUES ('30', '3s', '30');
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
`id` int(11) NOT NULL,
`name` varchar(50) NOT NULL,
`salary` int(11) DEFAULT NULL,
KEY `IDX_ID` (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES ('10', '1s', '10');
INSERT INTO `employee` VALUES ('20', '2s', '20');
INSERT INTO `employee` VALUES ('30', '3s', '30');
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`id` int(11) NOT NULL,
`salary` int(11) DEFAULT NULL,
KEY `IDX_ID` (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('10', '10');
INSERT INTO `emp` VALUES ('20', '20');
INSERT INTO `emp` VALUES ('30', '30');
表鎖的優(yōu)勢(shì):開銷?。患渔i快;無死鎖。
表鎖的劣勢(shì):鎖粒度大,發(fā)生鎖沖突的概率高,并發(fā)處理能力低。
加鎖的方式:自動(dòng)加鎖。查詢操作(SELECT),會(huì)自動(dòng)給涉及的所有表加讀鎖,更新操作(UPDATE、DELETE、INSERT),會(huì)自動(dòng)給涉及的表加寫鎖。也可以顯示加鎖。
共享讀鎖:lock table tableName read
獨(dú)占寫鎖:lock table tableName write
批量解鎖:unlock tables
step1:判斷表是否已被其他事務(wù)用表鎖鎖表
step2:判斷表中的每一行是否已被行鎖鎖住。
step1:不變
step2:發(fā)現(xiàn)表上有意向共享鎖,說明表中有些行被共享行鎖鎖住了,因此,事務(wù)B申請(qǐng)表的寫鎖會(huì)被阻塞。
-- select操作均不加鎖,采用的是快照讀,因此在下面的討論中就忽略了
SQL1:select * from t1 where id = 10;
SQL2:delete from t1 where id = 10;
Repeatable Read隔離級(jí)別下,id列上有一個(gè)非唯一索引,對(duì)應(yīng)SQL:delete from t1 where id = 10; 首先,通過id索引定位到第一條滿足查詢條件的記錄,加記錄上的X鎖,加GAP上的GAP鎖,然后加主鍵聚簇索引上的記錄X鎖,然后返回;然后讀取下一條,重復(fù)進(jìn)行。直至進(jìn)行到第一條不滿足條件的記錄[11,f],此時(shí),不需要加記錄X鎖,但是仍舊需要加GAP鎖,最后返回結(jié)束。
什么時(shí)候會(huì)取得gap lock或nextkey lock 這和隔離級(jí)別有關(guān),只在REPEATABLE READ或以上的隔離級(jí)別下的特定操作才會(huì)取得gap lock或nextkey lock。
# status代表當(dāng)前系統(tǒng)的運(yùn)行狀態(tài),只能查看,不能修改
show status like '%abc%';
show variables like '%abc%';
performance_schema.global_variables
performance_schema.session_variables
performance_schema.variables_by_thread
performance_schema.global_status
performance_schema.session_status
performance_schema.status_by_thread
performance_schema.status_by_account
performance_schema.status_by_host
performance_schema.status_by_user
INFORMATION_SCHEMA.GLOBAL_VARIABLES
INFORMATION_SCHEMA.SESSION_VARIABLES
INFORMATION_SCHEMA.GLOBAL_STATUS
INFORMATION_SCHEMA.SESSION_STATUS
# 查詢慢SQL查詢是否開啟
show variables like 'slow_query_log';
# 查詢慢SQL的時(shí)間
show variables like 'long_query_time';
# 查看慢SQL存放路徑,一般:/home/mysql/data3016/mysql/slow_query.log
show variables like 'slow_query_log_file';
# 查看數(shù)據(jù)庫的事務(wù)隔離級(jí)別,RDS:READ-COMMITTED Mysql:Repeatable read
show variables like 'tx_isolation';
# innodb數(shù)據(jù)頁大小 16384
show variables like 'innodb_page_size';
show status like 'innodb_row_%';
# 查看慢SQL
SHOW SLOW limit 10;
show full slow limit 10;
# 查看autocommit配置
select @@autocommit;
# 同上
show variables like 'autocommit';
#設(shè)置SQL自動(dòng)提交模式 1:默認(rèn),自動(dòng)提交 0:需要手動(dòng)觸發(fā)commit,否則不會(huì)生效
set autocommit=1;
# 查看默認(rèn)的搜索引擎
show variables like '%storage_engine%';
# 設(shè)置事務(wù)隔離級(jí)別
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
nb_soft_nature:小表
nb_soft:大表
package_name:都是索引
OOM command not allowed when used memory
maxmemory xxxxxx
config set maxmemory xxxxx
maxmemory-policy allkeys-lru
/data/program/dbatools-master/redisTools/redis-cli-new -h <ip> -p <port> --bigkeys --bigkey-numb 3
Sampled 122114 keys in the keyspace!
Total key length in bytes is 3923725 (avg len 32.13)
Biggest string Key Top 1 found 'xx1' has 36316 bytes
Biggest string Key Top 2 found 'xx2' has 1191 bytes
Biggest string Key Top 3 found 'xx3' has 234 bytes
Biggest list Key Top 1 found 'x4' has 204480 items
Biggest list Key Top 2 found 'x5' has 119999 items
Biggest list Key Top 3 found 'x6' has 60000 items
Biggest set Key Top 1 found 'x7' has 14205 members
Biggest set Key Top 2 found 'x8' has 292 members
Biggest set Key Top 3 found 'x,7' has 21 members
Biggest hash Key Top 1 found 'x' has 302939 fields
Biggest hash Key Top 2 found 'xc' has 92029 fields
Biggest hash Key Top 3 found 'xd' has 39634 fields
/usr/local/redis-3.0.5/src/redis-cli -c -h <ip> -p <port> --bigkeys
rdb -c memory dump.rdb -t list -f dump-formal-list.csv
[root@iZbp16umm14vm5kssepfdpZ redisTools]# redis-memory-for-key -s <ip> -p <port> x
Key x
Bytes 4274388.0
Type hash
Encoding hashtable
Number of Elements 39634
Length of Largest Element 29
debug object key
# 執(zhí)行時(shí)間大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的查詢進(jìn)行記錄。
slowlog-log-lower-than 1000
# 最多能保存多少條日志
slowlog-max-len 200
# 配置查詢時(shí)間超過1毫秒的, 第一個(gè)參數(shù)單位是微秒
config set slowlog-log-lower-than 1000
# 保存200條慢查記錄
config set slowlog-max-len 200
slowlog get
maxclients 10000
config set maxclients xxx
[rgp@iZ23rjcqbczZ ~]$ /data/program/redis-3.0.3/bin/redis-cli -c -h <ip> -p <port>
ip:port> cluster nodes
9f194f671cee4a76ce3b7ff14d3bda190e0695d5 m1 master - 0 1550322872543 65 connected 10923-16383
a38c6f957f2706f269cf5d9b628586a9372265e9 s1 slave 9f194f671cee4a76ce3b7ff14d3bda190e0695d5 0 1550322872943 65 connected
77ce43ec23f25f77ec68fe71ae3cb799e7300c6d s2 slave 03d72a3a5050c85e280e0bbeb687056b84f10077 0 1550322873543 63 connected
03d72a3a5050c85e280e0bbeb687056b84f10077 m2 master - 0 1550322873343 63 connected 5461-10922
5799070c6a63314296f3661b315b95c6328779f7 :0 slave,fail,noaddr 6147bf416ef216b6a1ef2f100d15de4f439b7352 1550320811474 1550320808793 49 disconnected
6147bf416ef216b6a1ef2f100d15de4f439b7352 m3 myself,master - 0 0 49 connected 0-5460
ip:port> cluster forget 61c70a61ad91bbac231e33352f5bdb9eb0be6289
CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節(jié)點(diǎn)
[rgp@iZ23rjcqbczZ ~]$ /data/program/redis-3.0.3/bin/redis-trib.rb del-node m3 b643d7baa69922b3fdbd1e25ccbe6ed73587b948
>>> Removing node b643d7baa69922b3fdbd1e25ccbe6ed73587b948 from cluster m3
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
[ERR] Node s3 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
/data/program/redis-3.0.3/bin/redis-server /data/program/redis-3.0.3/etc/7001/redis.conf &
[root@iZ23rjcqbczZ rgp]# /data/program/redis-3.0.3/bin/redis-trib.rb add-node --slave --master-id 6147bf416ef216b6a1ef2f100d15de4f439b7352 s3 m3
>>> Adding node s3 to cluster m3
>>> Performing Cluster Check (using node m3)
M: 6147bf416ef216b6a1ef2f100d15de4f439b7352 m3
slots:0-5460 (5461 slots) master
0 additional replica(s)
M: 9f194f671cee4a76ce3b7ff14d3bda190e0695d5 m1
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: a38c6f957f2706f269cf5d9b628586a9372265e9 s1
slots: (0 slots) slave
replicates 9f194f671cee4a76ce3b7ff14d3bda190e0695d5
S: 77ce43ec23f25f77ec68fe71ae3cb799e7300c6d s2
slots: (0 slots) slave
replicates 03d72a3a5050c85e280e0bbeb687056b84f10077
M: 03d72a3a5050c85e280e0bbeb687056b84f10077 m2
slots:5461-10922 (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node s3 to make it join the cluster.
Waiting for the cluster to join..
>>> Configure node as replica of m3.
[OK] New node added correctly.
s3:本次待添加的從節(jié)點(diǎn)ip:port
m3:主節(jié)點(diǎn)的ip:port
6147bf416ef216b6a1ef2f100d15de4f439b7352:主節(jié)點(diǎn)編號(hào)
netstat -n|grep SYN_RECV
netstat -anoe|grep 8000|wc -l 查看8000
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
netstat -n|grep TIME_WAIT|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -10
所謂'已失效的連接請(qǐng)求報(bào)文段'是這樣產(chǎn)生的。正常來說,客戶端發(fā)出連接請(qǐng)求,但因?yàn)檫B接請(qǐng)求報(bào)文丟失而未收到確認(rèn)。于是客戶端再次發(fā)出一次連接請(qǐng)求,后來收到了確認(rèn),建立了連接。數(shù)據(jù)傳輸完畢后,釋放了連接,客戶端一共發(fā)送了兩個(gè)連接請(qǐng)求報(bào)文段,其中第一個(gè)丟失,第二個(gè)到達(dá)了服務(wù)端,沒有'已失效的連接請(qǐng)求報(bào)文段'。
netstat -nap | grep SYN_RECV
<property name='METRICS_LOG_PATTERN'
value='%d{yyyy-MM-dd HH:mm:ss.SSS}|${APP_NAME}|%X{className}|%X{methodName}|%X{responseStatus}|%X{timeConsume}|%X{traceId}|%X{errorCode}|%msg%n'/>
<property name='ERROR_LOG_PATTERN'
value='%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{traceId}|${APP_NAME}|%serverIp|%X{tenantId}|%X{accountId}|%thread|%logger{30}|%msg%n'/>
<!--日志格式 時(shí)間|級(jí)別|鏈路id|應(yīng)用名|服務(wù)器ip|租戶id|用戶id|線程名稱|logger名稱|業(yè)務(wù)消息 -->
<property name='BIZ_LOG_PATTERN'
value='%d{yyyy-MM-dd HH:mm:ss.SSS}|%-5level|%X{traceId}|${APP_NAME}|%serverIp|%X{tenantId}|%X{accountId}|%thread|%logger{30}|%msg%n'/>
cat error.log|grep -n ' java.lang.reflect.InvocationTargetException'
cat biz.log |grep -n '489d71fe-67db-4f59-a916-33f25d35cab8'
歡迎各路技術(shù)同路人加入烏鶇科技,我們是阿里巴巴全資子公司,為政府、企業(yè)提供全方位數(shù)字化服務(wù)和解決方案,打通政府、企業(yè)與民眾的連接,助力政府的治理現(xiàn)代化,加速企業(yè)的數(shù)字化轉(zhuǎn)型,團(tuán)隊(duì)招聘高級(jí)研發(fā)工程師/技術(shù)專家(Java),base杭州,內(nèi)推直達(dá)郵箱 hxf240223@alibaba-inc.com、longhui.clh@alibaba-inc.com,快速響應(yīng)你的面試安排。
崗位要求:Java基礎(chǔ)扎實(shí),對(duì)JVM原理有一定的了解;對(duì)于用過的開源框架,了解到它的原理和機(jī)制;熟悉分布式系統(tǒng)的設(shè)計(jì)和應(yīng)用,有高并發(fā)應(yīng)用開發(fā)經(jīng)驗(yàn);較強(qiáng)的工作責(zé)任心和良好的溝通協(xié)調(diào)能力,能在壓力下獨(dú)立解決問題。
阿里云開發(fā)者成長(zhǎng)計(jì)劃面向全年齡段開發(fā)者,依托免費(fèi)資源、免費(fèi)體驗(yàn)、免費(fèi)學(xué)習(xí)、免費(fèi)實(shí)踐 4 大場(chǎng)景,全面助力開發(fā)者輕松掌握云上技能。新用戶專享輕量應(yīng)用服務(wù)器,內(nèi)置WordPress等8種主流環(huán)境,5M峰值帶寬,40GBSSD云盤,1000G流量包,輕松滿足學(xué)習(xí)、搭建應(yīng)用等場(chǎng)景!
聯(lián)系客服