诡异的ubuntu和centos
时间:2010-08-12
来源:互联网
内核里加了一个补丁,统计TCP连接建立的时间,然后可以通过/proc/net/tcp看到,比如
qxl@qxl-desktop:~$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode time_spent
0: 00000000:0015 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4565 0.0 1 dd52c500 300 0 0 2 -1
1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 3496 0.0 1 dd52c000 300 0 0 2 -1
2: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4342 0.0 1 df324000 300 0 0 2 -1
3: 16000001:0016 FE000001:0514 01 00000034:00000000 01:0000001F 00000000 0 0 10522 0.669 4 dd52ca00 32 4 5 5 -1
最后一条是1.0.0.22 到1.0.0.254的ssh连接建立的/proc记录项,我在内核的代码里也加了打印,时间也一样。
qxl@qxl-desktop:~$ dmesg
[ 218.942497] [-------------------------------------------Start---------------------------------------]
[ 218.942522] syn_requesting, req_ip = 010000fe,req_port = 1300,reply_ip = 01000016,reply_port = 22
[ 218.942622] tcp_v4_hnd_req,port = 1300,src = 010000fe,daddr = 01000016
[ 218.942695] include/net/sock.h,sk->sk_ack_backlog = 0, sk->sk_max_ack_backog = 128
[ 218.943194] Total time 0.669,Sock = dd52ca00
[ 218.943204] [--------------------------------------------End----------------------------------------]
两个时间都是0.669(ms),奇怪的问题是在centos操作系统下,编译的也是同样的内核代码(2.6.32),改动都一样。centos下dmesg能查看打印出的时间,但是在/proc/net/tcp里,没有建立的ssh连接的记录项,我查看了/proc/net/tcp的帮助文档,里面也是说先打印出监听态的socket,然后打印出已经建立连接的相关信息,但是在centos下全是监听态的,没有连接态的,
有哪位高手,能帮看看这个问题。另外,请问下,tcp4_seq_show(strcut seq_file *seq,void *v)里的两个参数,是从什么地方传递进去的?
qxl@qxl-desktop:~$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode time_spent
0: 00000000:0015 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4565 0.0 1 dd52c500 300 0 0 2 -1
1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 3496 0.0 1 dd52c000 300 0 0 2 -1
2: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4342 0.0 1 df324000 300 0 0 2 -1
3: 16000001:0016 FE000001:0514 01 00000034:00000000 01:0000001F 00000000 0 0 10522 0.669 4 dd52ca00 32 4 5 5 -1
最后一条是1.0.0.22 到1.0.0.254的ssh连接建立的/proc记录项,我在内核的代码里也加了打印,时间也一样。
qxl@qxl-desktop:~$ dmesg
[ 218.942497] [-------------------------------------------Start---------------------------------------]
[ 218.942522] syn_requesting, req_ip = 010000fe,req_port = 1300,reply_ip = 01000016,reply_port = 22
[ 218.942622] tcp_v4_hnd_req,port = 1300,src = 010000fe,daddr = 01000016
[ 218.942695] include/net/sock.h,sk->sk_ack_backlog = 0, sk->sk_max_ack_backog = 128
[ 218.943194] Total time 0.669,Sock = dd52ca00
[ 218.943204] [--------------------------------------------End----------------------------------------]
两个时间都是0.669(ms),奇怪的问题是在centos操作系统下,编译的也是同样的内核代码(2.6.32),改动都一样。centos下dmesg能查看打印出的时间,但是在/proc/net/tcp里,没有建立的ssh连接的记录项,我查看了/proc/net/tcp的帮助文档,里面也是说先打印出监听态的socket,然后打印出已经建立连接的相关信息,但是在centos下全是监听态的,没有连接态的,
有哪位高手,能帮看看这个问题。另外,请问下,tcp4_seq_show(strcut seq_file *seq,void *v)里的两个参数,是从什么地方传递进去的?
作者: peking_A_Liang 发布时间: 2010-08-12
QUOTE:
另外,请问下,tcp4_seq_show(strcut seq_file *seq,void *v)里的两个参数,是从什么地方传递进去的?
该函数应该是你读tcp这个proc文件的时候,会调用到该函数。你可以看一下调用该函数的程序
作者: Godbach 发布时间: 2010-08-12
ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
{
struct seq_file *m = (struct seq_file *)file->private_data;
size_t copied = 0;
loff_t pos;
size_t n;
void *p;
int err = 0;
mutex_lock(&m->lock);
/* Don't assume *ppos is where we left it */
if (unlikely(*ppos != m->read_pos)) {
m->read_pos = *ppos;
while ((err = traverse(m, *ppos)) == -EAGAIN)
;
if (err) {
/* With prejudice... */
m->read_pos = 0;
m->version = 0;
m->index = 0;
m->count = 0;
goto Done;
}
}
/*
* seq_file->op->..m_start/m_stop/m_next may do special actions
* or optimisations based on the file->f_version, so we want to
* pass the file->f_version to those methods.
*
* seq_file->version is just copy of f_version, and seq_file
* methods can treat it simply as file version.
* It is copied in first and copied out after all operations.
* It is convenient to have it as part of structure to avoid the
* need of passing another argument to all the seq_file methods.
*/
m->version = file->f_version;
/* grab buffer if we didn't have one */
if (!m->buf) {
m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
if (!m->buf)
goto Enomem;
}
/* if not empty - flush it first */
if (m->count) {
n = min(m->count, size);
err = copy_to_user(buf, m->buf + m->from, n);
if (err)
goto Efault;
m->count -= n;
m->from += n;
size -= n;
buf += n;
copied += n;
if (!m->count)
m->index++;
if (!size)
goto Done;
}
/* we need at least one record in buffer */
pos = m->index;
p = m->op->start(m, &pos);
while (1) {
err = PTR_ERR(p);
if (!p || IS_ERR(p))
break;
err = m->op->show(m, p);
seq_read()最终会调用 show函数,但是对于ubuntu和centos,同一个内核版本,而且是同一套自己修改的内核源码,代码没有任何差别,两者的/proc/net/tcp输出却不一样,这点非常不理解啊。请大家帮下。
{
struct seq_file *m = (struct seq_file *)file->private_data;
size_t copied = 0;
loff_t pos;
size_t n;
void *p;
int err = 0;
mutex_lock(&m->lock);
/* Don't assume *ppos is where we left it */
if (unlikely(*ppos != m->read_pos)) {
m->read_pos = *ppos;
while ((err = traverse(m, *ppos)) == -EAGAIN)
;
if (err) {
/* With prejudice... */
m->read_pos = 0;
m->version = 0;
m->index = 0;
m->count = 0;
goto Done;
}
}
/*
* seq_file->op->..m_start/m_stop/m_next may do special actions
* or optimisations based on the file->f_version, so we want to
* pass the file->f_version to those methods.
*
* seq_file->version is just copy of f_version, and seq_file
* methods can treat it simply as file version.
* It is copied in first and copied out after all operations.
* It is convenient to have it as part of structure to avoid the
* need of passing another argument to all the seq_file methods.
*/
m->version = file->f_version;
/* grab buffer if we didn't have one */
if (!m->buf) {
m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
if (!m->buf)
goto Enomem;
}
/* if not empty - flush it first */
if (m->count) {
n = min(m->count, size);
err = copy_to_user(buf, m->buf + m->from, n);
if (err)
goto Efault;
m->count -= n;
m->from += n;
size -= n;
buf += n;
copied += n;
if (!m->count)
m->index++;
if (!size)
goto Done;
}
/* we need at least one record in buffer */
pos = m->index;
p = m->op->start(m, &pos);
while (1) {
err = PTR_ERR(p);
if (!p || IS_ERR(p))
break;
err = m->op->show(m, p);
seq_read()最终会调用 show函数,但是对于ubuntu和centos,同一个内核版本,而且是同一套自己修改的内核源码,代码没有任何差别,两者的/proc/net/tcp输出却不一样,这点非常不理解啊。请大家帮下。
作者: peking_A_Liang 发布时间: 2010-08-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28