基于Linux的Socket网络编程的性能优化
2009-10-23 嵌入式在线 收藏 | 打印
1 引言
随着Intenet的日益发展和普及,网络在嵌入式系统中应用非常广泛,越来越多的嵌入式设备采用Linux操作系统。Linux是一个源代码公开的免费操作系统,具有强移植性,所以对基于Linux的Socket网络编程的研究越来越重要。
Socket实际是网络传输层供给应用层的编程接口。传输层则在网络层的基础上提供进程到进程问的逻辑通道,而应用层的进程则利用传输层向另一台主机的某一进程通信。Socket就是应用层与传输层之间的桥梁。如图2所示。
使用Socket编程时可以开发客户机和服务器应用程序,它们可以在本地网络上进行通信,也可以通过Internet在全球范围内进行通信。编写并运行 Socket的客户端和服务器端程序,双方通过套接字建立了服务连接请求,并且通过一些方法提高Socket的性能。
3 Socket编程
3.1 Socket类型
常见的Socket有3种类型:
(1)流式Socket(SOCK_STREAM)它提供可靠的通信流,使用面向连接的TCP协议,从而保证数据传输的正 ......
Linux Network Tuning Linux网络环境性能优化调整
来源:cnbird2008的专栏 作者: 发布时间:2009-06-20 标签:linux linux性能优化 linux配置
(以前写的,当时用的RH Linux AS5.)
如下网络配置参数调整,主要是针对请求压力大的Linux (2.6 kernel)服务器而言.
如果服务器压力不大,那么维持默认即可.
下述内容取材于"Performance Tuning For Linux Server"一书.
$ /proc/sys/net/core/wmem_max
最大socket写buffer,可参考的优化值:873200
$ /proc/sys/net/core/rmem_max
最大socket读buffer,可参考的优化值:873200
$ /proc/sys/net/ipv4/tcp_wmem
TCP写buffer,可参考的优化值: 8192 436600 873200
$ /proc/sys/net/ipv4/tcp_rmem
TCP读buffer,可参考的优化值: 32768 436600 873200
$ /proc/sys/net/ipv4/tcp_mem
同样有3个值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
上述内存单位是页,而不是字节.
可参考的优化值是:786432 1048576 1572864
&n ......
关于e820
e820是BIOS的(int 0x15)中断关联的。在使用此中断时,ax中必须是e820(ireg.ax=0xe820;)。通过此中断可以得到内存的系统布局。通过do循环,每次得到一段。
/linux32/arch/x86/include/asm/e820.h
宏E820_MAP是struct e820entry数据结构的指针,存放在参数块中位移为0x2d0的地方。
#define E820MAP 0x2d0 /* our map */
#define E820MAX 128 /* number of entries in E820MAP */
#define E820NR 0x1e8 /* # entries in E820MAP */
#define E820_RAM 1
#define E820_RESERVED 2
#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */
#define E820_NVS 4//此项表明rom eprom flash存储器。
#define E820_UNUSABLE 5
#include <linux/types.h>
s ......
--------------------------------------------------
几个宏:
PGDIR_SHIFT:确定页全局目录项能映射的区域大小的对数。此宏用于计算页全局目录中一个单独表项所能映射区域的大小。PGDIR_MASK用于屏蔽offset table,middle air,upper dir.字段的所有位。
#define PGDIR_SHIFT 22//当物理地址扩展机制(pae)被禁止时,当激活的时候,此时就为30位(12位偏移,9位表,9位中间目录)
#define PGDIR_SIZE (1UL << PGDIR_SHIFT)//此时为2的22次方,4MB.当激活的时候,就是2的30次方,1GB.
#define PGDIR_MASK (~(PGDIR_SIZE-1))//0xffc00000
PUD_SHIFT:确定页上级目录项能映射的区域大小的对数。此宏用于计算全局目录中的一个单独表项所能映射的区域大小。PUD_MASK用于屏蔽offset字段,table字段,中间层字段,upper dir字段的所有位。
#define PUD_SHIFT PGDIR_SHIFT
#define PUD_SIZE (1UL << PUD_SHIFT)
#define PUD_MASK ......
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
-->
在本文中,
Linux
是
GNU/Linux
桌面系统的泛称,其典型代表是
Ubuntu
9.10
发行版。计算机预装
Linux
是人们多年来的梦想。如今,这个梦想终于实现了。此话当真?
Ubuntu
9.10
中的各类程序
bugs
,目前还有
7
万
6
千个左右,呈现波浪式下降趋势。根据明显的道理,如果局限在某一特定款式的计算机硬件体系上,这种
bugs
总数将急剧下降。
Dell
公司内部有一支力量强大的测试团队,扫除程序
bugs
,实现完美预装,专门对付这种局面。近日,
Dell
推出
mini
10
和
mini
10v
两种新款式的上网本,预装
Ubuntu
9.10
(
Dell
修订版)桌面系统,被业内专家(如:
Steven
J. Vaughan-Nichols
)称为上网本之精品(见
Dell
官方网站)。
Dell
的这两款新机型,采用
Intel
最新的低功耗
Pine
Trail
芯片组(
Atom
N450
,
1.66GHz
),可连续运行
10
小时(
6-Cell
电池),
11.1
英寸显示屏,
1GB ......
在内存启动最开始时,bios的起主导作用,内核通过它来了解物理内存的情况。同时调用bios过程建立一组物理地址范围和其对应的内存类型。
通过函数machine_specific_memory_setup()函数来建立物理地址映射。此表可以获取,是内核在bios列表的基础上构建的;否则内核按照保守的缺省设置构建这张表:从0x9f(lowmemsize())到0x100(high_memory)号的所有页框都标记为保留。setup_memory函数构架这张表。
static unsigned long __init setup_memory(void)
{
unsigned long bootmap_size, start_pfn, max_low_pfn;
start_pfn = PFN_UP(init_pg_tables_end);
find_max_pfn();
max_low_pfn = find_max_low_pfn();
bootmap_size = init_bootmem(start_pfn, max_low_pfn);
register_bootmem_low_pages(max_low_pfn);
reserve_bootmem(HIGH_MEMORY, (PFN ......