0%

GitHub总是连接超时的问题

更新Hosts文件

手动指定GitHub域名的最新IP地址:

  1. 获取最新IP

    • 访问 https://ipaddress.com/,查询以下域名的IP:
      1
      2
      3
      github.com
      assets-cdn.github.com
      github.global.ssl.fastly.net
  2. 修改Hosts文件

    • WindowsC:\Windows\System32\drivers\etc\hosts

    • Mac/Linux/etc/hosts

 添加格式(示例):

 <!--hexoPostRenderEscape:<figure class="highlight accesslog"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">140.82.113.4</span> github.com</span><br></pre></td></tr></table></figure>:hexoPostRenderEscape-->

redis管道

redis管道可以一次性发送多条命令并在执行完后一次性将结果返回,当一组命令中每条命令都不依赖于之前命令的执行结果时就可以将这组命令一起通过管道发出。

可以通过管道减少客户端与Redis的通信次数

Innodb结构

索引

Innodb的索引分为聚簇索引和非聚簇索引(二级索引)。

聚簇索引是存储主键和数据本身,定位到该主键则直接检索数据而不需要额外的磁盘寻道。

非聚簇索引也就是二级索引,包含了主键以及索引,然后通过聚簇索引再去拿数据

缓冲池

Innodb使用缓冲池来存储数据变更和事务,通过数据变更保存到缓存池中的数据页中进行缓存。每次引用数据页都会放到缓存池中,发生改变后就标记为”dirty”。之后在写入磁盘中来更新数据

sql监控命令

  • show index from <table> 显示表的索引信息
  • show plugins 显示已知插件列表
  • show [full] processlist 显示系统上运行的所有线程
  • show [global | session] status 显示所有系统变量的值
  • show table status 显示数据库下表的详情,包括存储引擎、排序规则、创建信息、索引数据、行统计信息等
  • show [global | session] variables 显示系统变量

使用show命令时可以使用 like语句来进行筛选

  • show engine <engine_name> logs 显示指定存储引擎的日志信息
  • show engine <engine_name> status 显示指定存储引擎的状态信息
  • show engines 显示可用存储引擎列表
  • show binlog events [in '<log_file>'] [from <pos>] [limit [<offset>,]<row count>] 显示被记录到二进制日志的事件
  • show binary logs 显示二进制日志列表
  • show relaylog events [in '<log_file>'] [from <pos>] [limit [<offset>,]<row count>] 显示中继日志的事件
  • show master status 显示master的当前配置,当前二进制日志文件、文件的当前位置、所有排他性和包容性复制的设置
  • show slave hosts 显示连接到master的slave列表
  • show slave status 显示复制中的slave的系统状态信息

检查连接泄露

Druid连接池中有一个检查连接泄露的功能

1
2
3
4
5
6
7
<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="true"/>

<!-- 1800秒,也就是30分钟-->
<property name="removeAbandonedTimeout" value="180" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />

连接泄露检查,打开removeAbandoned功能,连接从连接池借出后,长时间不归还,将触发强制关闭其staement并归还。回收周期随timeBetweenEvictionRunsMillis进行,如果连接借出时间起超过removeAbandonedTimeout,则强制关闭其staement并归还。对性能会有一些影响,建议怀疑存在泄漏之后再打开,不建议在生产环境中使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public int removeAbandoned() {
int removeCount = 0;

long currrentNanos = System.nanoTime();

List<DruidPooledConnection> abandonedList = new ArrayList<DruidPooledConnection>();

activeConnectionLock.lock();
try {
Iterator<DruidPooledConnection> iter = activeConnections.keySet().iterator();

for (; iter.hasNext();) {
DruidPooledConnection pooledConnection = iter.next();

if (pooledConnection.isRunning()) {
continue;
}

long timeMillis = (currrentNanos - pooledConnection.getConnectedTimeNano()) / (1000 * 1000);

if (timeMillis >= removeAbandonedTimeoutMillis) {
iter.remove();
pooledConnection.setTraceEnable(false);
abandonedList.add(pooledConnection);
}
}
} finally {
activeConnectionLock.unlock();
}

if (abandonedList.size() > 0) {
for (DruidPooledConnection pooledConnection : abandonedList) {
final ReentrantLock lock = pooledConnection.lock;
lock.lock();
try {
if (pooledConnection.isDisable()) {
continue;
}
} finally {
lock.unlock();
}

JdbcUtils.close(pooledConnection);
pooledConnection.abandond();
removeAbandonedCount++;
removeCount++;

if (isLogAbandoned()) {
StringBuilder buf = new StringBuilder();
buf.append("abandon connection, owner thread: ");
buf.append(pooledConnection.getOwnerThread().getName());
buf.append(", connected at : ");
buf.append(pooledConnection.getConnectedTimeMillis());
buf.append(", open stackTrace\n");

StackTraceElement[] trace = pooledConnection.getConnectStackTrace();
for (int i = 0; i < trace.length; i++) {
buf.append("\tat ");
buf.append(trace[i].toString());
buf.append("\n");
}

buf.append("ownerThread current state is " + pooledConnection.getOwnerThread().getState()
+ ", current stackTrace\n");
trace = pooledConnection.getOwnerThread().getStackTrace();
for (int i = 0; i < trace.length; i++) {
buf.append("\tat ");
buf.append(trace[i].toString());
buf.append("\n");
}

LOG.error(buf.toString());
}
}
}

return removeCount;
}