use of io.mycat.net.mysql.RowDataPacket in project Mycat_plus by coderczp.
the class ShowDirectMemory method showDirectMemoryTotal.
public static void showDirectMemoryTotal(ManagerConnection c) {
ByteBuffer buffer = c.allocate();
// write header
buffer = totalHeader.write(buffer, c, true);
// write fields
for (FieldPacket field : totalFields) {
buffer = field.write(buffer, c, true);
}
// write eof
buffer = totalEof.write(buffer, c, true);
// write rows
byte packetId = totalEof.packetId;
long usedforMerge = 0;
long usedforNetwork = 0;
long chunkSizeBytes = 0;
int chunkCount = 0;
if (processorBufferPoolType == 2 && bufferPool instanceof NettyBufferPool) {
/**
*计算逻辑就是,1.先计算PoolChunk分配的页,表示已经消耗的内存,
* 2.然后计算小于一页情况,记录小于一页内存使用情况,
* 上面二者合起来就是整个netty 使用的内存,
* 已经分配了,但是没有使用的内存的情况
*/
List<PoolArenaMetric> list = ((NettyBufferPool) bufferPool).getAllocator().getAlloc().directArenas();
chunkSizeBytes = ((NettyBufferPool) bufferPool).getAllocator().getChunkSize();
long pageSize = ((NettyBufferPool) bufferPool).getAllocator().getPageSize();
long chunksUsedBytes = 0;
/**
*PoolArenas
*/
for (PoolArenaMetric pool : list) {
List<PoolChunkListMetric> pcks = pool.chunkLists();
/**
*针对PoolChunkList
*/
for (PoolChunkListMetric pck : pcks) {
Iterator<PoolChunkMetric> it = pck.iterator();
while (it.hasNext()) {
chunkCount++;
PoolChunkMetric p = it.next();
chunksUsedBytes += (chunkSizeBytes - p.freeBytes());
}
}
List<PoolSubpageMetric> tinySubpages = pool.tinySubpages();
for (PoolSubpageMetric tiny : tinySubpages) {
chunksUsedBytes -= (pageSize - (tiny.maxNumElements() - tiny.numAvailable()) * tiny.elementSize());
}
List<PoolSubpageMetric> smallSubpages = pool.smallSubpages();
for (PoolSubpageMetric small : smallSubpages) {
chunksUsedBytes -= (pageSize - (small.maxNumElements() - small.numAvailable()) * small.elementSize());
}
}
usedforNetwork = chunkCount * chunkSizeBytes;
}
ConcurrentHashMap<Long, Long> bufferpoolUsageMap = bufferPool.getNetDirectMemoryUsage();
RowDataPacket row = new RowDataPacket(TOTAL_FIELD_COUNT);
try {
/**
* 通过-XX:MaxDirectMemorySize=2048m设置的值
*/
row.add(JavaUtils.bytesToString2(Platform.getMaxDirectMemory()).getBytes(c.getCharset()));
if (useOffHeapForMerge == 1) {
/**
* 结果集合并时,总共消耗的DirectMemory内存
*/
ConcurrentHashMap<Long, Long> concurrentHashMap = MycatServer.getInstance().getMyCatMemory().getResultMergeMemoryManager().getDirectMemorUsage();
for (Map.Entry<Long, Long> entry : concurrentHashMap.entrySet()) {
usedforMerge += entry.getValue();
}
}
/**
* 网络packet处理,在buffer pool 已经使用DirectMemory内存
*/
if (processorBufferPoolType == 2) {
usedforNetwork = chunkSizeBytes * chunkCount;
} else {
for (Map.Entry<Long, Long> entry : bufferpoolUsageMap.entrySet()) {
usedforNetwork += entry.getValue();
}
}
row.add(JavaUtils.bytesToString2(usedforMerge + usedforNetwork).getBytes(c.getCharset()));
long totalAvailable = 0;
if (useOffHeapForMerge == 1) {
/**
* 设置使用off-heap内存处理结果集时,防止客户把MaxDirectMemorySize设置到物理内存的极限。
* Mycat能使用的DirectMemory是MaxDirectMemorySize*DIRECT_SAFETY_FRACTION大小,
* DIRECT_SAFETY_FRACTION为安全系数,为OS,Heap预留空间,避免因大结果集造成系统物理内存被耗尽!
*/
totalAvailable = (long) (Platform.getMaxDirectMemory() * MyCatMemory.DIRECT_SAFETY_FRACTION);
} else {
totalAvailable = Platform.getMaxDirectMemory();
}
row.add(JavaUtils.bytesToString2(totalAvailable - usedforMerge - usedforNetwork).getBytes(c.getCharset()));
if (useOffHeapForMerge == 1) {
/**
* 输出安全系统DIRECT_SAFETY_FRACTION
*/
row.add(("" + MyCatMemory.DIRECT_SAFETY_FRACTION).getBytes(c.getCharset()));
} else {
row.add(("1.0").getBytes(c.getCharset()));
}
long resevedForOs = 0;
if (useOffHeapForMerge == 1) {
/**
* 预留OS系统部分内存!!!
*/
resevedForOs = (long) ((1 - MyCatMemory.DIRECT_SAFETY_FRACTION) * (Platform.getMaxDirectMemory() - 2 * MycatServer.getInstance().getTotalNetWorkBufferSize()));
}
row.add(resevedForOs > 0 ? JavaUtils.bytesToString2(resevedForOs).getBytes(c.getCharset()) : "0".getBytes(c.getCharset()));
row.packetId = ++packetId;
buffer = row.write(buffer, c, true);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c, true);
// write buffer
c.write(buffer);
}
use of io.mycat.net.mysql.RowDataPacket in project Mycat_plus by coderczp.
the class ShowHeartbeatDetail method response.
public static void response(ManagerConnection c, String stmt) {
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c, true);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c, true);
}
// write eof
buffer = eof.write(buffer, c, true);
// write rows
byte packetId = eof.packetId;
Pair<String, String> pair = ManagerParseHeartbeat.getPair(stmt);
String name = pair.getValue();
for (RowDataPacket row : getRows(name, c.getCharset())) {
row.packetId = ++packetId;
buffer = row.write(buffer, c, true);
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c, true);
// post write
c.write(buffer);
}
use of io.mycat.net.mysql.RowDataPacket in project Mycat_plus by coderczp.
the class ShowRouter method execute.
public static void execute(ManagerConnection c) {
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c, true);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c, true);
}
// write eof
buffer = eof.write(buffer, c, true);
// write rows
byte packetId = eof.packetId;
for (NIOProcessor p : MycatServer.getInstance().getProcessors()) {
RowDataPacket row = getRow(p, c.getCharset());
row.packetId = ++packetId;
buffer = row.write(buffer, c, true);
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c, true);
// write buffer
c.write(buffer);
}
use of io.mycat.net.mysql.RowDataPacket in project Mycat_plus by coderczp.
the class ShowSQLLarge method getRow.
private static RowDataPacket getRow(String user, io.mycat.statistic.stat.UserSqlLargeStat.SqlLarge sql, String charset) {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(StringUtil.encode(user, charset));
row.add(LongUtil.toBytes(sql.getSqlRows()));
row.add(LongUtil.toBytes(sql.getStartTime()));
row.add(LongUtil.toBytes(sql.getExecuteTime()));
row.add(StringUtil.encode(sql.getSql(), charset));
return row;
}
use of io.mycat.net.mysql.RowDataPacket in project Mycat_plus by coderczp.
the class ShowSQLSumTable method getRow.
private static RowDataPacket getRow(TableStat tableStat, long idx, String charset) {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(LongUtil.toBytes(idx));
if (tableStat == null) {
row.add(StringUtil.encode(("not fond"), charset));
return row;
}
String table = tableStat.getTable();
long R = tableStat.getRCount();
long W = tableStat.getWCount();
String __R = decimalFormat.format(1.0D * R / (R + W));
StringBuffer relaTableNameBuffer = new StringBuffer();
StringBuffer relaTableCountBuffer = new StringBuffer();
List<TableStat.RelaTable> relaTables = tableStat.getRelaTables();
if (!relaTables.isEmpty()) {
for (TableStat.RelaTable relaTable : relaTables) {
relaTableNameBuffer.append(relaTable.getTableName()).append(", ");
relaTableCountBuffer.append(relaTable.getCount()).append(", ");
}
} else {
relaTableNameBuffer.append("NULL");
relaTableCountBuffer.append("NULL");
}
row.add(StringUtil.encode(table, charset));
row.add(LongUtil.toBytes(R));
row.add(LongUtil.toBytes(W));
row.add(StringUtil.encode(String.valueOf(__R), charset));
row.add(StringUtil.encode(relaTableNameBuffer.toString(), charset));
row.add(StringUtil.encode(relaTableCountBuffer.toString(), charset));
row.add(LongUtil.toBytes(tableStat.getLastExecuteTime()));
return row;
}
Aggregations