首页 > 编程知识 正文

ora-06502字符串缓冲区太小,linux

时间:2023-05-04 17:02:05 阅读:120031 作者:801

Author :精明的鸵鸟

创建: 2013-4-17

blog:http://blog.csdn.net/c 359719435 /

版权所有2013精明的鸵鸟http://blog.csdn.net/c359719435/

以及转载请注明出处

关于设置socket tcp缓冲区大小的问题

1 )发现如果在setsockopt中设置缺省缓冲区SO_SNDBUF和SO_RCVBUF的值,并在getsockopt中获取设置的值,则返回值是设置值的两倍。 为什么?

在网上查找,然后查看linux内核代码/usr/src/Linux-2.6.13.2/net/core/sock.c,找到此代码的函数名为sock_setsockopt

case SO_SNDBUF:

/* don ' terroronthisbsddoesn ' tandifyouthink

aboutitthisisright.otherwiseappshaveto

play ' guessthebiggestsize ' games.rcvbuf/snd buf

are treated in BSD as hints */

if(valsysctl_wmem_max )//val是要设置的缓冲区大小的值

val=sysctl_wmem_max; 如果//大于最大值,则将val值设置为最大值

sk-sk _ user locks|=sock _ snd buf _ lock;

if () val* ) SOCK_MIN_SNDBUF )//val的两倍小于最小值时,设置为最小值

sk-sk_sndbuf=SOCK_MIN_SNDBUF;

else

sk-sk_sndbuf=val *; //val的2倍大于最小值时,设定为val值的2倍

/*

*唤醒up sending tasks if we

*升级the value。

*/

sk-sk_write_space(sk;

布雷克;

case SO_RCVBUF:

/* don ' terroronthisbsddoesn ' tandifyouthink

aboutitthisisright.otherwiseappshaveto

play ' guessthebiggestsize ' games.rcvbuf/snd buf

are treated in BSD as hints */

if(valsysctl_rmem_max ) )。

val=sysctl_rmem_max;

sk-sk _ user locks|=sock _ rcvbuf _ lock;

/* fix me : isthislowerboundtherightone? */

if () val* ) SOCK_MIN_RCVBUF ) )。

sk-sk_rcvbuf=SOCK_MIN_RCVBUF;

else

sk-sk_rcvbuf=val *;

布雷克;

根据上述代码,(1)设置val的最大值sysctl_wmem_max将设置为最大值的两倍。 2*sysctl_wmem_max;

)2)如果有设定值2倍的val*2最小值,则设定为最小值(SOCK_MIN_SNDBUF )。

(3)在设定值val的最大值sysctl_wmem_max且val*2 SOCK_MIN_SNDBUF的情况下,设定为2*val。

查看linux文档:

SO_RCVBUF :

setsorgetsthemaximumsocketreceivebufferinbytes。

thekerneldoublesthisvalue (toallowspaceforbookkeepingoverhead ) when it is set using setsockopt )、

andthisdoubledvalueisreturnedbygetsockopt (。

thedefaultvalueissetbythe/proc/sys/net/core/rmem _ default file,

andthemaximumallowedvalueissetbythe/proc/sys/net/core/rmem _ max文件。

The minimu

m (doubled) value for this option is .

查看我的主机Linux 2.6.6 :/proc/sys/net/core/rmem_max:

4194304 //4M

查看/proc/sys/net/core/wmem_max:

8388608   //8M

所以,能设置的接收缓冲区的最大值是8M,发送缓冲区的最大值是16M。

疑惑2:为什么要有2倍这样的一个内核设置呢?我的理解是,用户在设置这个值的时候,可能只考虑到数据的大小,没有考虑数据封包的字节开销。所以将这个值设置成两倍。

注:overhead,在计算机网络的帧结构中,除了有用数据以外,还有很多控制信息,这些控制信息用来保证通信的完成。这些控制信息被称作系统开销。

2 tcp缓冲区大小的默认值

建立一个socket,通过getsockopt获取缓冲区的值如下:

发送缓冲区大小:SNDBufSize = 16384

接收缓冲区大小:RCVBufSize = 87380

疑惑3:linux手册中,接收缓冲区的默认值保存在/proc/sys/net/core/rmem_default,发送缓冲区保存在/proc/sys/net/core/wmem_default。

[root@cfs_netstorage core]# cat /proc/sys/net/core/rmem_default

1048576

[root@cfs_netstorage core]# cat /proc/sys/net/core/wmem_default

512488

可知,接收缓冲区的默认值是:1048576,1M。发送缓冲区的默认值是:512488,512K。为什么建立一个socket时得到的默认值是87380、16384???

进一步查阅资料发现, linux下socket缓冲区大小的默认值在/proc虚拟文件系统中有配置。分别在一下两个文件中:

/proc/sys/net/ipv4/tcp_wmem

[root@cfs_netstorage core]# cat /proc/sys/net/ipv4/tcp_wmem

4096    16384   131072  //第一个表示最小值,第二个表示默认值,第三个表示最大值。

/proc/sys/net/ipv4/tcp_rmem

[root@cfs_netstorage core]# cat /proc/sys/net/ipv4/tcp_rmem

4096    87380   174760

由此可见,新建socket,选取的默认值都是从这两个文件中读取的。可以通过更改这两个文件中的值进行调优,但是最可靠的方法还是在程序中调用setsockopt进行设置。通过setsockopt的设置,能设置的接收缓冲区的最大值是8M,发送缓冲区的最大值是16M(Linux 2.6.6中)。

另一文章中简单介绍:http://www.linuxidc.com/Linux/2012-08/68874.htm

1. tcp 收发缓冲区默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_rmem

4096    87380   4161536

87380  :tcp接收缓冲区的默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/ipv4/tcp_wmem

4096    16384   4161536

16384  : tcp 发送缓冲区的默认值

2. tcp 或udp收发缓冲区最大值

[root@ www.linuxidc.com]# cat /proc/sys/net/core/rmem_max

131071

131071:tcp 或 udp 接收缓冲区最kydlr设置值的一半。

也就是说调用 setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen);  时rcv_size 如果超过 131071,那么

getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcv_size, &optlen); 去到的值就等于 131071 * 2 = 262142

[root@ www.linuxidc.com]# cat /proc/sys/net/core/wmem_max

131071

131071:tcp 或 udp 发送缓冲区最kydlr设置值得一半。

跟上面同一个道理

3. udp收发缓冲区默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/core/rmem_default

111616:udp接收缓冲区的默认值

[root@ www.linuxidc.com]# cat /proc/sys/net/core/wmem_default

111616

111616:udp发送缓冲区的默认值

4. tcp 或udp收发缓冲区最小值

tcp 或udp接收缓冲区的最小值为 256 bytes,由内核的宏决定;

tcp 或udp发送缓冲区的最小值为 2048 bytes,由内核的宏决定

socket tcp缓冲区大小的默认值、最大值

Author:精明的鸵鸟 Created:2013-4-17 Blog:http://blog.csdn.net/c359719435/ Copyright 2013 精明的鸵鸟 http://blog.cs ...

TCP缓冲区大小及限制

这个问题在前面有的部分已经涉及,这里在重新总结下.主要参考UNIX网络编程. (1)数据报大小IPv4的数据报最大大小是65535字节,包括IPv4首部.因为首部中说明大小的字段为16位.IPv6的数 ...

TCP/IP学习(四)TCP缓冲区大小及限制(转)

链接来自:http://blog.csdn.net/ysu108/article/details/7764461 这个问题在前面有的部分已经涉及,这里在重新总结下.主要参考UNIX网络编程. (1)数 ...

[转]linux tcp/ip调优

LINUX tcp/ip性能调优 On 2011年03月15日, in linux, tips, by netoearth 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接 ...

Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小

Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小 作者:hldxz 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不 ...

udp之关于linux udp收发包缓冲区大小

1.修订单个socket的缓冲区大小:通过setsockopt使用SO_RCVBUF来设置接收缓冲区,该参数在设置的时候不会与rmem_max进行对比校验,但是如果设置的大小超过rmem_max的话, ...

[cmd]如何设置 Windows 默认命令行窗口大小和缓冲区大小

Windows 命令行 cmd 窗口系统默认的大小(80*40)对于现在的屏幕配置已经跟不上时代了,我们总是要把它改大些,而且缓冲区大小也想改得大大的.单纯的为当前的 Windows 命令行窗口修改显 ...

如何设置 Windows 默认命令行窗口大小和缓冲区大小

关键字: 命令行不能全屏 命令行最大化只有一半屏幕 命令行 字体 背景 颜色 解决方案:http://unmi.cc/save-windows-command-size/ 简要说明: win+r,输入 ...

Redis 的 maxmemory 和 dbnum 默认值都是多少?对于最大值会有限制吗?

一.Redis 的默认配置 了解 Redis 的都知道,Redis 服务器状态有很多可配置的默认值. 例如:数据库数量,最kydlr用内存,AOF 持久化相关配置和 RDB 持久化相关配置等等.我相信,关于 ...

随机推荐

Python学习教程(learning Python)--1.3 Python数据输入

多数应用程序都有数据输入语句,用于读入数据,和用户进行交互,在Python语言里,可以通过raw_input函数实现数据的从键盘读入数据操作. 基本语法结构:raw_input(prompt) 通常p ...

RHEL6中ulimit的nproc限制

http://blog.csdn.net/kumu_linux/article/details/8301760 当前shell下更改用户可打开进程数 修改limits.conf配置文件生效 [root ...

ORACLE ORDER BY用法总结

order by后面的形式却比较新颖(对于我来说哦),以前从来没看过这种用法,就想记下来,正好总结一下ORDER BY的知识. 1.ORDER BY 中关于NULL的处理 缺省处理,Oracle在Or ...

如何选择版本控制系统 ---为什么选择Git版本控制系统

版本控制系统 "代码"作为软件研发的核心产物,在整个开发周期都在递增,不断合入新需求以及解决bug的新patch,这就需要有一款系统,能够存储.追踪文件的修改历史,记录多个版本的开 ...

primary库新增数据文件后,standby库无法创建文件并终止数据同步

主库是RAC环境,使用asm存放数据文件,备库是操作系统本地文件系统存放数据文件.在主库执行以下操作: SQL> alter tablespace ysdv add datafile '+dat ...

audio video 控制播放和停止

...

Java学习笔记11(this,super)

this在构造方法间的使用, public class Person { private String name; private int age; public Person() { //this( ...

08-03 java 继承

继承格式,优缺点,概述: /* 继承概述: 把多个类中相同的内容给提取出来定义到一个类中. 如何实现继承呢? Java提供了关键字:extends 格式: class 子类名 extends 父类名 ...

验证组件——FluentValidation

FluentValidation FluentValidation是与ASP.NET DataAnnotataion Attribute验证实体不同的数据验证组件,提供了将实体与验证分离开 ...

【MySQL笔记】用户管理

1.账户管理 1.1登录和退出MySQL服务器 MySQL –hhostname|hostIP –P port –u username –p[password] databaseName –e &qu ...

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。