shiyang6017

shiyang6017 查看完整档案

上海编辑上海交通大学  |  计算机 编辑  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

shiyang6017 收藏了文章 · 3月13日

那些年动态库加载碰到的事er

那些年那些事

Static变量

  • 更新so后 值不变

    • TODO
  • load-load-unload core

    • TODO

链接那点事

So搜索路径

  • 优先级

    1. 链接时参数-Wl,-rpath

      • ldd *.so时,若存在路径unknown的依赖库,那么该参数在链接时,就是未配置的
      • 不存在路径unknown的依赖库,也不意味着链接时就用了这个参数
    2. 运行时ld_library_path

      • 该变量中若存在多个路径时,从左往右,优先级递减
    3. 系统配置/etc/ld.so.conf
  • 其他

    • RUNPATH
    • -rpath-link

运行时加载

  • dlopen参数

    • RTLD_GLOBAL

      • 使得库中的解析的定义变量在随后的其它的链接库中变得可以使用
    • RTLOAD_LOCAL

      • 语义和RTLD_GLOBAL相反,默认行为,工程开发中,更为稳妥些。
  • dlclose

    • 当调用该函数后,动态库可能并未从内存中unload。甚至在部分情况下,根本不会unload
    • Although dlclose operation is not required to remove structures from an address space, neither is an implementation prohibited from doing so. The only restriction on such a removal is that no object shall be removed to which references have been relocated, until or unless all such references are removed. 翻译一下就是,dlclose没有要求实际unload,也没要求不unload。如果以RTLD_GLOBAL的方式dlopen动态库,且该动态库的变量被进程其他模块引用,那么除非这些引用全部失效,才可以unload动态库。

QA

Q: 一个so load-unload-load时发生了啥
A: unload可能并未生效,因为load-unload-load的行为等价于load的行为,静态变量可能并未初始化两次

Q: 拷贝一个so到另外的路径,依次load后,dlopen后,拿到的是一个handler吗
A:不是,是两个handler。静态变量会初始化两次

查看原文

shiyang6017 收藏了文章 · 3月13日

那些年动态库加载碰到的事er

那些年那些事

Static变量

  • 更新so后 值不变

    • TODO
  • load-load-unload core

    • TODO

链接那点事

So搜索路径

  • 优先级

    1. 链接时参数-Wl,-rpath

      • ldd *.so时,若存在路径unknown的依赖库,那么该参数在链接时,就是未配置的
      • 不存在路径unknown的依赖库,也不意味着链接时就用了这个参数
    2. 运行时ld_library_path

      • 该变量中若存在多个路径时,从左往右,优先级递减
    3. 系统配置/etc/ld.so.conf
  • 其他

    • RUNPATH
    • -rpath-link

运行时加载

  • dlopen参数

    • RTLD_GLOBAL

      • 使得库中的解析的定义变量在随后的其它的链接库中变得可以使用
    • RTLOAD_LOCAL

      • 语义和RTLD_GLOBAL相反,默认行为,工程开发中,更为稳妥些。
  • dlclose

    • 当调用该函数后,动态库可能并未从内存中unload。甚至在部分情况下,根本不会unload
    • Although dlclose operation is not required to remove structures from an address space, neither is an implementation prohibited from doing so. The only restriction on such a removal is that no object shall be removed to which references have been relocated, until or unless all such references are removed. 翻译一下就是,dlclose没有要求实际unload,也没要求不unload。如果以RTLD_GLOBAL的方式dlopen动态库,且该动态库的变量被进程其他模块引用,那么除非这些引用全部失效,才可以unload动态库。

QA

Q: 一个so load-unload-load时发生了啥
A: unload可能并未生效,因为load-unload-load的行为等价于load的行为,静态变量可能并未初始化两次

Q: 拷贝一个so到另外的路径,依次load后,dlopen后,拿到的是一个handler吗
A:不是,是两个handler。静态变量会初始化两次

查看原文

shiyang6017 收藏了文章 · 3月13日

那些年动态库加载碰到的事er

那些年那些事

Static变量

  • 更新so后 值不变

    • TODO
  • load-load-unload core

    • TODO

链接那点事

So搜索路径

  • 优先级

    1. 链接时参数-Wl,-rpath

      • ldd *.so时,若存在路径unknown的依赖库,那么该参数在链接时,就是未配置的
      • 不存在路径unknown的依赖库,也不意味着链接时就用了这个参数
    2. 运行时ld_library_path

      • 该变量中若存在多个路径时,从左往右,优先级递减
    3. 系统配置/etc/ld.so.conf
  • 其他

    • RUNPATH
    • -rpath-link

运行时加载

  • dlopen参数

    • RTLD_GLOBAL

      • 使得库中的解析的定义变量在随后的其它的链接库中变得可以使用
    • RTLOAD_LOCAL

      • 语义和RTLD_GLOBAL相反,默认行为,工程开发中,更为稳妥些。
  • dlclose

    • 当调用该函数后,动态库可能并未从内存中unload。甚至在部分情况下,根本不会unload
    • Although dlclose operation is not required to remove structures from an address space, neither is an implementation prohibited from doing so. The only restriction on such a removal is that no object shall be removed to which references have been relocated, until or unless all such references are removed. 翻译一下就是,dlclose没有要求实际unload,也没要求不unload。如果以RTLD_GLOBAL的方式dlopen动态库,且该动态库的变量被进程其他模块引用,那么除非这些引用全部失效,才可以unload动态库。

QA

Q: 一个so load-unload-load时发生了啥
A: unload可能并未生效,因为load-unload-load的行为等价于load的行为,静态变量可能并未初始化两次

Q: 拷贝一个so到另外的路径,依次load后,dlopen后,拿到的是一个handler吗
A:不是,是两个handler。静态变量会初始化两次

查看原文

shiyang6017 发布了文章 · 3月13日

那些年动态库加载碰到的事er

那些年那些事

Static变量

  • 更新so后 值不变

    • TODO
  • load-load-unload core

    • TODO

链接那点事

So搜索路径

  • 优先级

    1. 链接时参数-Wl,-rpath

      • ldd *.so时,若存在路径unknown的依赖库,那么该参数在链接时,就是未配置的
      • 不存在路径unknown的依赖库,也不意味着链接时就用了这个参数
    2. 运行时ld_library_path

      • 该变量中若存在多个路径时,从左往右,优先级递减
    3. 系统配置/etc/ld.so.conf
  • 其他

    • RUNPATH
    • -rpath-link

运行时加载

  • dlopen参数

    • RTLD_GLOBAL

      • 使得库中的解析的定义变量在随后的其它的链接库中变得可以使用
    • RTLOAD_LOCAL

      • 语义和RTLD_GLOBAL相反,默认行为,工程开发中,更为稳妥些。
  • dlclose

    • 当调用该函数后,动态库可能并未从内存中unload。甚至在部分情况下,根本不会unload
    • Although dlclose operation is not required to remove structures from an address space, neither is an implementation prohibited from doing so. The only restriction on such a removal is that no object shall be removed to which references have been relocated, until or unless all such references are removed. 翻译一下就是,dlclose没有要求实际unload,也没要求不unload。如果以RTLD_GLOBAL的方式dlopen动态库,且该动态库的变量被进程其他模块引用,那么除非这些引用全部失效,才可以unload动态库。

QA

Q: 一个so load-unload-load时发生了啥
A: unload可能并未生效,因为load-unload-load的行为等价于load的行为,静态变量可能并未初始化两次

Q: 拷贝一个so到另外的路径,依次load后,dlopen后,拿到的是一个handler吗
A:不是,是两个handler。静态变量会初始化两次

查看原文

赞 1 收藏 1 评论 0

shiyang6017 收藏了文章 · 3月12日

shell 命令总结

网络

netstat -apn | grep [端口号] # 查看端口被进程的占用情况

tcpdump -i  lo # 抓取本地loop的包

远程免密码登录

从A主机远程链接B主机(user_name@host_name)
以下操作在A主机完成

ssh-keygen -t rsa
ssh-copy-id user_name@host_name
ssh user_name@host_name // 第一次仍然需要密码

进程

ps -aux # 进程信息查看
查看原文

shiyang6017 收藏了文章 · 3月12日

深入探索C++对象模型 chapter 1

chapter 1

C++ 在布局以及存取时间上的额外开销是由virtual引起:

A. virtual function 机制

B. virtual base class 

1.1 C++对象模型

知识点 1

class Point {
public:
    Point(float xval);
    virtual ~Point();
    
    float x() const;
    static int PointCount();
protected:
    virtual ostream& 
        print (ostream&os) const;
    float _x;
    static int _point_count;
}; 

该函数声明包含:

3种 class member functions: static、nonstatic 和 virtual
2种 class data members: static 和 nonstatic

C++对象模型
clipboard.png

1. C++中的虚函数是通过虚函数表(vtbl)来实现.
2. 每一个类对象会被安插一个指针(vptr),指向该类的虚函数表。
3. vptr的设定和重置都由每一个类的构造函数、析构函数和复制赋值运算符自动完成。

知识点 2 C++支持多重继承

class iostream:
    public istream,
    public ostream {}; 
    
class istream : virtual public ios{};
class ostream : virtual public ios{};

暂略

知识点 3 策略性正确的struct

C++中凡处于同一个access section(public, protected, private)的数据,必定保证以其声明顺序出现在内存布局中。
然而被放置在多个access sections 中的各数据,排列顺序就不一定了

C struct 在C++中的一个合理用途,是当你要传递“一个复杂的class object 的全部或部分”到某个C函数去时,
struct声明可以将数据封装起来,并保证拥有与C兼容的空间布局。然而这项保证只在组合的情况下才存在
``

知识点 4

需要多少内存才能表现一个class object
1. nonstatic data members 的总和
2. 因alignment的需求而填补(padding)上去的空间
3. 因支持virtual而由内部产生的任何额外负担

知识点 5 指针的类型

ZooAnimal *px;
int *ptr;
vector<String>* ptr;

三个指针的不同之处在于其寻址出来的object类型不同。
也就说“指针类型”会教导编译器如何解释某个特定地址中的内存内容及其大小
转换是一种编译器指令。一般不改变一个指针所含的真正地址,它只影响 “被指出之内存的大小和其内容的解释方式”

加上多态之后:

class ZooAnimal{
public:
    ZooAnimal();
    virtual ~ZooAnimal();
    virtual void rotate();
protected:
    int loc;
    String name;
};
class Bear : public ZooAnimal {
public:
    Bear();
    ~Bear();
    void rotate();
    virtual void dance();
Protected:
    enum Dances { ... };
    Dances dances-known;
    int cell_block;
};

内存布局
clipboard.png

Bear b;
ZooAnimal za = b; 

za.rotate();

为什么rotate()所调用的是ZooAnimal实例而不是Bear ?

编译器确保如果某个object含有一个及以上的vptrs,那些vptrs的内容不会被base class object 初始化或改变

P34 : 如果virtual funtion 被定义为inline,则更有效率上的收获 ??
virtual function 是在运行期间确定的,inline function 在编译期被确定, 两者不是冲突吗

查看原文

shiyang6017 收藏了文章 · 3月12日

深度探索C++对象模型 chapter 3

Data 语意学

class X{};
class Y : public virtual X{};
class Z : public virtual X{};
class A : public Y, public Z {};
/* linux 3.10 gcc 4.8.5  X86_64 不同平台是不同的*/
sizeof (X) : 1 byte
sizeof (Y) : 8 byte
sizeof (Z) : 8 byte
sizeof (A) : 16 byte

clipboard.png

3.1 Data Member 的绑定

1. 对member function本体的分析,会直到整个class的声明都出现了才开始

extern float x;  

class Point3d {  
public:  
    Point3d(float, float, float);  
    /* Q : 被传回和被设定的x是哪一个x?
     * A : class内部的x
     */  
    float X() const { return x; }   
    void X(float new_x) const { x = new_x; }  
private:  
    float x, y, z;  
};

2. 对member function的argument list的分析,是当即完成的。

typedef int length;

class Point3d{
public:
    void mumble(length val){ _val = val; }; // length is "int" not "float"
private:
    typedef float length;
    length _val;
};

/*该这么写*/
typedef int length;

class Point3d{
 typedef float length;          // correct
public:
    void mumble(length val){ _val = val; }; 
private:
    length _val;
};

3.2 Data Member 的布局

Nonstatic data members在class object中的排列顺序将和其被声明的顺序一样

3.3 Data Member的存取

Point3d origin, *pt = &origin; 

origin.x = 0.0;  
pt->x = 0.0;  

Q : 从origin存取"和"从pt存取"有什么重大的差异?
当Point3d是一个derived class,而在其继承结构中有一个virtual base class,并且被存取的member是
一个从该virtual base class继承而来的member时,就会有重大的差异".这时不能够说ptr必然指向哪一种
class type, 所以这个存取操作必须延迟至执行期经由一个额外的间接导引,才能够解决.
但如果使用origin,就不会有这些问题,其类型无疑是Point3d class

3.4 "继承"与Data Member

class Concrete1 {
public:
 // ...
private:
 int val;
 char bit1;
};
class Concrete2 : public Concrete1 {
public:
 // ...
private:
 char bit2;
};
class Concrete3 : public Concrete2 {
public:
 // ...
private:
 char bit3;
};

作者扯淡呀, 在gcc上 Concrete3 的大小为8B 没有padding呀!!!!

查看原文

shiyang6017 收藏了文章 · 3月12日

深度探索C++对象模型 chapter 2

Chapter 2 构造函数语意学

Q : 一个空类 默认产生哪些成员函数
A: 构造函数,析构函数, 拷贝构造函数,赋值运算符,取址运算符, 取址运算符 const

2.1 Default Constructor 的构造操作

Q: 什么时候才会合成一个default constructor ?
A: 当编译器需要它的时候。
Q: 什么时候?
A: 如下四种情况
1.带有 default constructor 的 member class object
2.带有 default constructor 的 base class
3.带有 virtual function 的 class(声明或继承)
4.带有 virtual Base Class" 的 class

// 初始化语义
class Top{ 
public: 
    int a;
    Top(int _a):a(_a){} 
}; 
class Left : virtual public Top{ 
public: 
    Left(int _a, int _b):Top(_a), b(_b){} 
    int b;
}; 
class Right : virtual public Top{ 
public: 
    Right(int _a, int _c):Top(_a), c(_c){} 
    int c;
}; 
class Bottom : public Left, public Right{ 
public:
    /*无论虚基类出现在继承层次中任何地方,总是在构造非虚基类之前构造虚基类
      与其出现在初始化位置无关
    */
    Bottom(int _a, int _b, int _c, int _d): 
        Top(_a), Left(_a, _b), Right(_a, _c), d(_d){} 
    int d;
};
void foo(const left* ptr) { ptr->a = 1024; }

//可能的编译器转变操作:其中, __vbcX表示编译器所产生的指针,指向virtual base class Top
void foo(const left* ptr) {ptr->_vbcX->a = 1024; }

2.2 Copy Constructor 的构造函数

当class不展现 bitwise copy semantices时,copy constructor产生

2.3 程序转化语意学

copy constructor的应用,迫使编译器多少对程序代码进行转化。尤其当一个函数以传值的方式传回一个class object,
而该class有个copy constructor时。

2.4 成员的初始化队伍

Q : 什么情况下,必须使用member initialization list:
A : 1. 当初始化化一个reference member
A : 2. 初始化一个const member
A : 3. 当调用一个base class的constructor,而它拥有一组参数
A : 4. 当调用一个member class的constructor,而它拥有一组参数

注意:list中的项目顺序是由class中的members声明顺序决定的,不是有initialization list的顺序决定的
注意:initialization list的调用被放在explicit user code之前

查看原文

shiyang6017 收藏了文章 · 3月12日

鸟哥的Linux私房菜 第13章 学习shell script

第13章 学习shell script

13.4 条件判别式

# if XXX; then XXX elif XXX; then XXX else fi 
filename='shiyang.txt'
if [ -f $filename ]; then
    echo -e "$filename is a regular file."
elif [ -d $filename ]; then
    echo -e "$filename is a directory." 
else
    echo -e "err."
fi
#while XXX do XXX done 
a=1
b=1
LIMIT=$((2*2))
while [ "$b" -lt "$LIMIT" ] && [ "$a" -lt "$LIMIT" ]
do
    tmp=$(($a + $b))
    a=$b
    b=$tmp
done
echo $a $b
# for XX in YY do ZZ done    
files=$(ls -a)
for file in $files
do
    if [ -f "$file" ]; then
        echo "$file is a regular file."
    elif [ -d "$file" ]; then
        echo "$file is a directory"
    else
        echo "$file: unknowed type."
    fi
done
#for XX do YY done
END=4
for ((i=0;i<"$END";i++))
do
    echo $i
done
#case esac
read -p "please enter username:  " username
case $username in
    "shiyang")
    echo "$username exists: normal user."
    ;;
    
    "heanni")
    echo "$username exists: normal user."
    ;;
    
    "root")
    echo "$username exists: superuser."
    ;;
    *)
    echo "$username does not exist."
    ;;

esac
查看原文

shiyang6017 收藏了文章 · 3月12日

套接字内核参数

套接字内核参数

内核参数设置

以修改somaxconn举例:

1.暂时性修改(系统重启后保存不了)

step 1

echo 2048 >   /proc/sys/net/core/somaxconn

step 2

sysctl -p

2.永久性修改,在/etc/sysctl.conf中添加如下

step 1

net.core.somaxconn = 2048

step 2

sysctl -p

内核套接字参数

以下文件的所在目录为/proc/sys/net/ipv4 或 /proc/sys/net/core/ (Centos Linux release 7.2.1511)

tcp_retries1

[TCP/IP详解 卷一(中文 第二版) P464]
reference
重传超过阈值tcp_retries1,主要的动作就是更新路由缓存

tcp_retries2

[TCP/IP详解 卷一(中文 第二版) P464]

tcp_syn_retries & tcp_synack_retries

[TCP/IP详解 卷一(中文 第二版) P464]
For SYN segments, net.ipv4.tcp_syn_retries and net.ipv4.tcp_synack_retries bounds the number of retransmissions of SYN segments; their default value is 5 (roughly 180s).

tcp_fin_timeout

[TCP/IP详解 卷一(中文 第二版) P446]
和FIN_WAIT_2有关

tcp_abort_on_overflow

[TCP/IP详解 卷一(中文 第二版) P455]
If there is not enough room on the queue for the new connection, the TCP delays responding to the SYN, to give the application a chance to catch up. Linux is somewhat unique in this behavior—it persists in not ignoring incoming connections if it possibly can. If the net.ipv4.tcp_abort_on_overflow system control variable is set, new incoming connections are reset with a reset segment.

tcp_max_syn_backlog

[TCP/IP详解 卷一(中文 第二版) P458]
When a connection request arrives (i.e.,the SYN segment), the system-wide parameter tcp_max_syn_backlog is checked (default 1000). If the number of connections in the SYN_RCVD state would exceed this threshold, the incoming connection is rejected.

tcp_timestamps

TCP Timestamps Option (TSopt):
结构:

  +-------+-------+---------------------+---------------------+
  |Kind=8 |  10   |   TS Value (TSval)  |TS Echo Reply (TSecr)|
  +-------+-------+---------------------+---------------------+
      1       1              4                     4

 The Timestamps option carries two four-byte timestamp fields.
 The Timestamp Value field (TSval) contains the current value of
 the timestamp clock of the TCP sending the option.

 The Timestamp Echo Reply field (TSecr) is only valid if the ACK
 bit is set in the TCP header; if it is valid, it echos a times-
 tamp value that was sent by the remote TCP in the TSval field
 of a Timestamps option.  When TSecr is not valid, its value
 must be zero.  The TSecr value will generally be from the most
 recent Timestamp option that was received; however, there are
 exceptions that are explained below.

默认开启, 作用:1.更加精准的测量RTT; 2.防回绕序列号(PAWS)

reference

tcp_tw_reuse && tcp_tw_recyle

reference(一篇极好的文章)

tcp_tw_reuse
By enabling net.ipv4.tcp_tw_reuse, Linux will reuse an existing connection in the TIME-WAIT state for a new outgoing connection if the new timestamp is strictly bigger than the most recent timestamp recorded for the previous connection: an outgoing connection in the TIME-WAIT state can be reused after just one second.

Q : 重用(reuse)什么
A : connection, 内核中的相关套接字数据结构
Q : 谁重用这些数据结构
A : 处于TIME_WAIT状态的一方,再一次发起相同连接(TCP套接字四元组一致)的时候,进行重用。
Q : 具体流程以及为什么依赖tcp_timestamps
A : 见如下分析
Once a new connection replaces the TIME-WAIT entry [time 1], the SYN segment of the new connection is ignored (thanks to the timestamps) [time 2] and won’t be answered by a RST [time 3] but only by a retransmission of the FIN and ACK segment [time 3]. The FIN segment will then be answered with a RST (because the local connection is in the SYN-SENT state)[time 4] which will allow the transition out of the LAST-ACK state. The initial SYN segment will eventually be resent (after one second) because there was no answer and the connection will be established without apparent error, except a slight delay:

clipboard.png

tcp_tw_recyle
建议不要打开该选项
Starting from Linux 4.10 (commit 95a22caee396), Linux will randomize timestamp offsets for each connection, making this option completely broken, with or without NAT.

需要了解内核套接字的数据结构:TODO

net.ipv4.tcp_syncookies

[TCP/IP详解 卷一(中文 第二版) P455]
当net.ipv4.tcp_syncookies = 1, 表示开启SYN Cookies。 当出现SYN等待队列溢出时,启用cookies来处理,可防范SYN攻击,默认为0,表示关闭。

tcp_dsack

[TCP/IP详解 卷一(中文 第二版) P482]

tcp_sack

默认开启
[TCP/IP详解 卷一(中文 第二版) P478]

somaxconn

[TCP/IP详解 卷一(中文 第二版) P455]
Each listening endpoint has a fixed-length queue of connections that have been completely accepted by TCP (i.e., the three-way handshake is complete) but not yet accepted by the application. The application specifies a limit to this queue, commonly called the backlog. This backlog must be between 0 and a system-specific maximum called net.core.somaxconn, inclusive (default 128).

netdev_max_backlog

TODO

rmem_max && wmem_max && rmem_default && wmem_default

reference

net.core.rmem_default = 262144  // 单个连接的读缓存(其实,读缓存还是动态变化的,这是一个上限)
net.core.rmem_max = 16777216  // 当调用setsockopt设置最大读缓存时,不能超过rmem_max
net.core.wmem_default = 262144  
net.core.wmem_max = 16777216  

tcp_moderate_rcvbuf && tcp_rmem && tcp_wmem && tcp_mem

reference

设置好最大缓存限制后就高枕无忧了吗?对于一个TCP连接来说,可能已经充分利用网络资源,使用大窗口、大缓存来保持高速传输了。比如在长肥网络中,缓存上限可能会被设置为几十兆字节,但系统的总内存却是有限的,当每一个连接都全速飞奔使用到最大窗口时,1万个连接就会占用内存到几百G了,这就限制了高并发场景的使用,公平性也得不到保证。我们希望的场景是,在并发连接比较少时,把缓存限制放大一些,让每一个TCP连接开足马力工作;当并发连接很多时,此时系统内存资源不足,那么就把缓存限制缩小一些,使每一个TCP连接的缓存尽量的小一些,以容纳更多的连接。

linux为了实现这种场景,引入了自动调整内存分配的功能,由tcp_moderate_rcvbuf配置决定,如下:
net.ipv4.tcp_moderate_rcvbuf = 1
默认tcp_moderate_rcvbuf配置为1,表示打开了TCP内存自动调整功能。若配置为0,这个功能将不会生效(慎用)。
当我们在编程中对连接设置了SO_SNDBUF、SO_RCVBUF,将会使linux内核不再对这样的连接执行自动调整功能!

net.ipv4.tcp_rmem = 8192 87380 16777216  
net.ipv4.tcp_wmem = 8192 65536 16777216  
net.ipv4.tcp_mem = 8388608 12582912 16777216 

tcp_rmem[3]数组表示任何一个TCP连接上的读缓存上限,其中tcp_rmem[0]表示最小上限(比如,使用调用setsockopt设置最大读缓存时,若其值小于8192,那么最大读缓存会被设置为8192),tcp_rmem[1]表示初始上限(注意,它会覆盖适用于所有协议的rmem_default配置),tcp_rmem[2]表示最大上限。
tcp_wmem[3]数组表示写缓存,与tcp_rmem[3]类似,不再赘述。

tcp_mem[3]数组就用来设定TCP内存的整体使用状况,所以它的值很大(它的单位也不是字节,而是--4K或者8K等这样的单位!)。这3个值定义了TCP整体内存的无压力值、压力模式开启阀值、最大使用值。以这3个值为标记点则内存共有4种情况:

1、只要系统TCP的总体内存超了 tcp_mem[2] ,新内存分配都会失败。
2、tcp_rmem[0]或者tcp_wmem[0]优先级也很高,只要条件1不超限,那么只要连接内存小于这两个值,就保证新内存分配一定成功。
3、只要总体内存不超过tcp_mem[0],那么新内存在不超过连接缓存的上限时也能保证分配成功。
4、tcp_mem[1]与tcp_mem[0]构成了开启、关闭内存压力模式的开关。在压力模式下,连接缓存上限可能会减少。在非压力模式下,连接缓存上限可能会增加,最多增加到tcp_rmem[2]或者tcp_wmem[2]。

TODO

tcp_adv_win_scale
tcp_allowed_congestion_control
tcp_app_win
tcp_autocorking
tcp_available_congestion_control
tcp_base_mss
tcp_challenge_ack_limit
tcp_congestion_control

tcp_early_retrans
tcp_ecn
tcp_fack
tcp_fastopen
tcp_fastopen_key

tcp_frto
tcp_invalid_ratelimit
tcp_keepalive_intvl
tcp_keepalive_probes
tcp_keepalive_time
tcp_limit_output_bytes
tcp_low_latency
tcp_max_orphans
tcp_max_ssthresh

tcp_max_tw_buckets
tcp_mem
tcp_min_tso_segs
tcp_moderate_rcvbuf
tcp_mtu_probing
tcp_no_metrics_save
tcp_notsent_lowat
tcp_orphan_retries
tcp_reordering
tcp_retrans_collapse
tcp_rfc1337
tcp_rmem

tcp_slow_start_after_idle
tcp_stdurg
tcp_thin_dupack
tcp_thin_linear_timeouts

tcp_tso_win_divisor
tcp_tw_recycle
tcp_window_scaling
tcp_wmem
tcp_workaround_signed_windows
udp_mem
udp_rmem_min
udp_wmem_min
xfrm4_gc_thresh

查看原文

认证与成就

  • 获得 39 次点赞
  • 获得 1 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 1 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2016-09-30
个人主页被 1.1k 人浏览