你应该知道的那些超时设置或默认参数

本文详细介绍了Redis、MongoDB、MySQL等数据库的连接池配置及超时设置,涵盖maxActive、maxIdle等参数详解,并涉及memcache、ActiveMQ等中间件的相关设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

郑昀总结
最后 更新于2013年6月19日

  • 存储介质
    • Redis
  1. maxActive:可用连接实例的最大数目,默认值为8;
  2. maxIdle:空闲连接实例的最大数目,默认值也是8;
  3. minIdle:空闲连接实例的最小数目,默认值为0;
  4. maxWait:等待可用连接的最大数目,单位毫秒,默认值为-1,表示永不超时。
mongodb
  • Server端的连接数
    • maxConns:mongodb 实例的最大连接数限制可以通过启动参数中的 maxConns 设置。默认值取决于系统的限制(如 ulimit 和 file descriptor)。如果没设置这个参数, mongodb 自己不会限制连接数。但,你不能设置超过 20,000 。
  • client端的连接
    • Java-Driver
  1. MongoOptions.maxWaitTime:连接上阻塞线程的最大等待时间,默认值120秒;
  2. MongoOptions.connectTimeout:建立新连接超时时间(郑昀注: Only used for new connections), 默认无限制;
  3. MongoOptions.socketTimeout:socket通讯超时时间,默认无限制;
  4. MongoOptions.connectionsPerHost:每个Application与 MongoDB 实例能建立的最大物理连接数,默认是10;
  5. MongoOptions.threadsAllowedToBlockForConnectionMultiplier:可以等待池中有连接可用的最大线程数,默认是5。
mysql
  • Server端的超时设置
  1. innodb_lock_wait_timeout:一个 InnoDB 事务遇到一个行锁,等待的超时时间,默认值50秒,届时会打印“Lock wait timeout exceeded; try restarting transaction”错误;
  2. wait_timeout:服务器关闭非交互连接之前等待活动的秒数,默认值28800秒(即8小时);
  3. connect_timeout:在获取链接时,等待握手的超时时间,只在登录时有效,默认值10秒。
JDBC
  • ibatis
    • SqlMapConfig.xml 配置文件
  1. maxTransactions:最大并发事务数。默认值为32。指的是同时进入 SqlMapClient.startTransaction()的最大线程数。大于这个值的线程将阻塞直到另一个线程退出。不同的 DBMS 有不同的限制值,但任何数据库都有这些限制。这个参数值应该总是小于或等于 maxSessions 并总是远远小于 maxRequests。减小这个参数值通常能提高性能;
  2. maxRequests:最大并发请求数(Statement并发数)。默认值为512。指的是同时执行 SQL 语句的最大线程数。大于这个值的线程将阻塞直到另一个线程执行完成。不同的 DBMS有不同的限制值,但任何数据库都有这些限制。通常这个值应该至少是 maxTransactions 的 10 倍,并且总是大于 maxSessions 和 maxTranactions。减小这个参数值通常能提高性能;
  3. maxSessions:最大Session 数。即当前最大允许的并发SqlMapClient数。maxSessions设定必须介于maxTransactions和maxRequests之间,即maxTransactions<maxSessions=<maxRequests。默认值为128。
  4. defaultStatementTimeout:Statement 的执行超时时间,单位为秒。如果没有指明,查询将无超时时间限制,除非在映射文件中设置Statement属性值。
memcache
  • PHP-Driver
    • Memcache::connect 函数传入的 timeout 参数代表连接超时时间,单位秒。默认值1秒。郑昀注:修改此值之前请三思,过长的连接超时时间可能会导致失去所有的缓存优势。 
  • Java-Driver
    • spymemcached
      • opTimeout :代表操作超时时间,默认值2.5秒;
    • xmemcahced 
      • opTimeout 的定义与 spymemcached 一样,默认值1秒;
WebServer
  • Nginx
  1. fastcgi_connect_timeout:同 FastCGI 服务器的连接超时时间,默认值60秒。郑昀注:它不能超过75秒新请求在等待 fastcgi_connect_timeout 秒后就收到 504 Gateway Time-out 错误;
  2. fastcgi_send_timeout: Nginx 进程向 FastCGI 进程发送 request ,整个过程的超时时间,默认值60秒;
  3. fastcgi_read_timeout:  FastCGI  进程向  Nginx  进程发送 response ,整个过程的超时时间,默认值60秒。
PHP
  • PHP-FPM 模式
    • max_execution_time 参数不太起效,它控制的是进程的CPU占用时间,默认值30秒;
      • 郑昀set_time_limit()函数和配置指令max_execution_time只影响脚本本身执行的时间。任何发生在诸如使用 system()系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。
    • 真正起作用的是 php-fpm.conf 里的 <value name="request_terminate_timeout">0s</value>,它的含义是 The timeout (in seconds) for serving a single request after which the worker process will be terminated;默认值0,即off。
中间件
  • ActiveMQ
    • Server端设置
  1. wireFormat.maxInactivityDuration:设置心跳时间,默认值是30秒;
  2. initialReconnectDelay:第一次重连的时间间隔(毫秒),默认值为10;
  3. maxReconnectDelay:最长重连的时间间隔(毫秒),默认值为30秒;
  4. useExponentialBackOff:重连时间间隔是否以指数形式增长,默认值为true;
  5. startupMaxReconnectAttempts:初始化时的最大重连次数。一旦连接上,将使用maxReconnectAttempts的配置,默认值为0;
  6. maxReconnectAttempts:自版本5.6起:-1为默认值,代表不限重试次数;0代表从不重试(只尝试连接一次,并不重连)。5.6以前的版本:0为默认值,代表不限重试次数。所有版本:如果设置为大于0的数,代表最大重试次数;
  7. randomize:使用随机链接(郑昀:达到负载均衡的目的),默认值为true;
  8. timeout:设置发送操作的总计最大超时时间(毫秒),默认值为-1。
生产者流量控制
  • 触发条件有三个:
    • 不管 mq 有无做持久化配置:
      • ActiveMQ所使用的内存到达 memoryUsage 配置值,默认值64MB;
    • 如果 mq 做了持久化配置:
      • 要打开了 useCache 开关,表明要将持久化消息缓存起来以便快速访问,默认是True;
      • 缓存在内存中消息总字节数到达 memoryLimit 配置值,默认值是1MB;
 
-待续-
 
 
赠图2枚:
http://ww3.sinaimg.cn/mw1024/6a4475c9jw1e5mc7lc6z7j20bv0hs75f.jpg
 
 
http://ww4.sinaimg.cn/bmiddle/75d41147jw1e5fv93mkhhj20c60mumy2.jpg
 
 
<think>我们正在讨论RT-Thread中rt_mutex_take函数的超时参数设置。根据引用[1]和引用[2],rt_mutex_take函数的原型为: rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t timeout); 其中,timeout参数的单位是时钟节拍(tick)。在RT-Thread中,时钟节拍是系统的最小时间单位,由RT_TICK_PER_SECOND定义,通常为1000(即1秒=1000个tick)。 根据引用[1]和引用[2]中的示例,我们可以设置不同的超时时间: 1. 永久等待(阻塞直到获取锁):使用RT_WAITING_FOREVER(即-1)。 2. 不等待(立即返回):使用0。 3. 指定等待时间:使用正整数,表示等待的tick数。 例如,如果我们希望等待100毫秒,假设系统tick为1ms(即RT_TICK_PER_SECOND=1000),那么超时参数应设置为100。 具体设置方法如下: ```c rt_err_t result; rt_mutex_t mutex; // 假设已经初始化好的互斥锁 // 尝试获取互斥锁,等待100毫秒 result = rt_mutex_take(mutex, 100); if (result == RT_EOK) { // 成功获取锁 // ... 执行临界区代码 ... rt_mutex_release(mutex); // 释放锁 } else { // 超时其他错误 rt_kprintf("Take mutex timeout or error! Error code: %d\n", result); } ``` 超时参数设置注意事项: 1. **超时时间计算**:实际等待时间 = (timeout * 1000) / RT_TICK_PER_SECOND 毫秒。例如,当RT_TICK_PER_SECOND=1000时,100个tick就是100毫秒。 2. **返回值处理**: - RT_EOK:成功获取锁。 - -RT_ETIMEOUT:超时(在指定时间内未获取到锁)。 - -RT_ERROR:其他错误(如互斥锁未初始化等)。 3. **避免死锁**:在设置超时时间时,应避免过长的等待导致系统响应变慢,同时也要考虑任务优先级(高优先级任务可能长时间占用锁,导致低优先级任务无法获取锁而超时)。 4. **系统时钟精度**:超时时间受系统tick精度限制,最小等待时间为1个tick。 5. **非阻塞模式**:设置timeout=0,表示非阻塞模式,如果锁不可用立即返回-RT_ETIMEOUT。 另外,根据引用[4],互斥量具有优先级继承机制,当高优先级任务因等待低优先级任务占有的互斥量而阻塞时,低优先级任务的优先级会被提升到与高优先级任务相同,以减少优先级反转问题。因此,在设置超时时间时,应结合优先级继承机制来设计。 总结:正确设置rt_mutex_take的超时参数需要根据实际需求(等待时间)和系统配置(RT_TICK_PER_SECOND)来确定。一般步骤: - 确定需要等待的时间(毫秒)。 - 计算tick数:tick = (等待时间毫秒 * RT_TICK_PER_SECOND) / 1000。 - 调用rt_mutex_take,传入计算得到的tick值。 - 检查返回值,进行相应的处理。 数学公式: 设等待时间为 $T$(毫秒),系统每秒的tick数为 $S$(即RT_TICK_PER_SECOND),则超时参数 $timeout$ 的计算公式为: $$timeout = \frac{T \times S}{1000}$$ 注意:结果取整数(向上向下取整,通常使用整数除法)。 例如:$T=200$ 毫秒,$S=1000$,则 $timeout = \frac{200 \times 1000}{1000} = 200$。 [^1]: [引用1]说明了rt_mutex_take函数的基本用法和参数含义,包括超时参数可以设置为0(立即返回)RT_WAITING_FOREVER(永久等待)。 [^2]: [引用2]展示了rt_mutex_take的使用示例,其中超时参数设置为RT_WAITING_FOREVER。 [^4]: [引用4]详细说明了互斥量的释放机制和优先级继承特性,这对于理解互斥锁的行为很重要。 §§相关问题§§ 1. RT-Thread中如何计算系统tick与实际时间的转换? 2. 互斥锁的优先级继承机制如何避免优先级反转? 3. 除了互斥锁,RT-Thread还有哪些同步机制可以设置超时时间?</think>### 如何正确设置 `rt_mutex_take()` 的超时参数 在 RT-Thread 中设置 `rt_mutex_take()` 的超时参数需要理解其工作机制和不同参数值的含义。以下是详细设置指南: #### 1. **超时参数类型与单位** - 参数类型:`rt_int32_t timeout` - 时间单位:**系统时钟节拍(tick)** - 转换公式(毫秒转 tick): $$ \text{tick} = \frac{\text{毫秒} \times \text{RT_TICK_PER_SECOND}}{1000} $$ 其中 `RT_TICK_PER_SECOND` 是系统配置的每秒 tick 数(默认为 1000) #### 2. **三种典型设置模式** ```c // 模式1:永久等待(阻塞直到获取锁) rt_mutex_take(mutex, RT_WAITING_FOREVER); // 等价于 -1 // 模式2:零等待(非阻塞尝试) rt_mutex_take(mutex, 0); // 立即返回结果 // 模式3:指定超时时间(单位:tick) rt_mutex_take(mutex, 200); // 等待 200 tick(若RT_TICK_PER_SECOND=1000,则200ms) ``` #### 3. **返回值处理策略** 根据引用[1][4]: ```c rt_err_t result = rt_mutex_take(mutex, timeout); switch(result) { case RT_EOK: // 成功获取锁 /* 访问共享资源 */ rt_mutex_release(mutex); // 引用[3][4] break; case -RT_ETIMEOUT: // 超时未获取 rt_kprintf("Mutex timeout!\n"); break; case -RT_ERROR: // 其他错误(如未初始化) rt_kprintf("Mutex error!\n"); break; } ``` #### 4. **实际应用示例 假设系统配置为 `RT_TICK_PER_SECOND=1000`(1 tick=1ms),实现 500ms 超时: ```c #define TIMEOUT_MS 500 const rt_int32_t timeout_ticks = (TIMEOUT_MS * RT_TICK_PER_SECOND) / 1000; if (rt_mutex_take(g_socket_mutex, timeout_ticks) == RT_EOK) { // 安全操作共享Socket send(sock, data, len, 0); rt_mutex_release(g_socket_mutex); // 引用[3][4] } else { rt_kprintf("Socket access timeout after %dms\n", TIMEOUT_MS); } ``` #### 5. **关键注意事项** 1. **优先级反转防护** RT-Thread 的互斥锁具有优先级继承机制(引用[4]),但仍需注意: - 高优先级任务等待时间不应超过其截止时间 - 临界区代码应尽量简短 2. **超时值选择原则** - 实时任务:使用 `RT_WAITING_FOREVER` 确保确定性 - 非关键任务:设置合理超时(如 100-500ms) - 错误恢复:超时后应处理异常状态(如重连 Socket) 3. **性能优化技巧** ```c // 高频场景:使用非阻塞模式 + 定时器重试(引用[5]) if (rt_mutex_take(mutex, 0) != RT_EOK) { rt_timer_start(&retry_timer); // 启动定时器稍后重试 } ``` #### 数学关系 设: - $T_{\text{timeout}}$ = 超时时间(毫秒) - $R_{\text{tps}}$ = `RT_TICK_PER_SECOND` 则超时参数: $$ \text{timeout} = \left\lceil \frac{T_{\text{timeout}} \times R_{\text{tps}}}{1000} \right\rceil $$ 此公式确保时间精度与系统配置解耦[^1][^5]。 > **最佳实践**:在 `rtconfig.h` 中定义超时常量: > ```c > #define SOCKET_TIMEOUT_MS 200 > #define SOCKET_TIMEOUT_TICKS (SOCKET_TIMEOUT_MS * RT_TICK_PER_SECOND / 1000) > ``` [^1]: 超时参数设置为 0 表示立即返回,RT_WAITING_FOREVER 表示永久等待[^1]。 [^3]: 完成资源访问后必须调用 `rt_mutex_release()`[^3]。 [^4]: 互斥锁具有持有计数机制,需确保释放次数与获取次数匹配[^4]。 [^5]: 定时器机制可用于实现超时后的异步重试策略[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值