记一次性你调优 IO瓶颈

http://blog.csdn.net/hualusiyu/article/details/10023281



top - 18:38:56 up 5 days, 14:48,  7 users,  load average: 53.43, 188.00, 422.23
Tasks: 504 total,   1 running, 494 sleeping,   9 stopped,   0 zombie
Cpu(s):  1.6%us,  0.4%sy,  0.0%ni, 97.8%id,  0.1%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  65923236k total, 16464576k used, 49458660k free,   194628k buffers
Swap:  4095992k total,        0k used,  4095992k free,  6482424k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                
15435 root      20   0 19.6g 4.9g  10m S 157.6  7.8  92:22.20 java                                                                  
22890 root      20   0 15288 1428  828 R  3.8  0.0   0:00.04 top                                                                    
    1 root      20   0 19352 1624 1312 S  0.0  0.0   0:02.53 init                                                                   
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.22 kthreadd                                                               
    3 root      RT   0     0    0    0 S  0.0  0.0   0:00.30 migration/0                                                            
    4 root      20   0     0    0    0 S  0.0  0.0   1:34.54 ksoftirqd/0                                                            
    5 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 migration/0                                                            
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.50 watchdog/0   


发现load巨高,,,,【最好看看单个核的wa参数】


iostat -x -d -m 1 10

Linux 2.6.32-279.el6.x86_64 (localhost.localdomain)     03/03/2014      _x86_64_        (24 CPU)



Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.01     9.00    0.05    1.65     0.00     0.04    51.01     0.00    0.45   0.23   0.04


Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00


Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00


Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    24.00    0.00    4.00     0.00     0.11    56.00     0.00    0.25   0.25   0.10


Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util

sda               0.00    23.00    0.00    2.00     0.00     0.10   100.00     0.01    3.00   1.50   0.30




[root@localhost classes]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  1      0 49571696 194440 6387936    0    0     0     2    0    3  2  1 98  0  0
 2  1      0 49557080 194440 6388180    0    0     0    66 16366 19851  5  2 92  2  0
 2  1      0 49556576 194440 6388364    0    0     0     0 15859 19556  4  1 92  3  0


从iostat跟vmstat命令来看,,,,,貌似  io的负载不是很高,,,,,,

这只能说明本地磁盘不是瓶颈,,,,但是网络硬盘呢???发单牵扯到语言单的存储等

iotop

Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                              
16816 be/4 root        0.00 B/s    5.93 K/s  0.00 %  0.04 % java -Djava.util.logging.config.fil~che.catalina.startup.Bootstrap start
15811 be/4 root        0.00 B/s    2.97 K/s  0.00 %  0.03 % java -Djava.util.logging.config.fil~che.catalina.startup.Bootstrap start
16462 be/4 root        0.00 B/s    2.97 K/s  0.00 %  0.00 % java -Djava.util.logging.config.fil~che.catalina.startup.Bootstrap start
15968 be/4 root        0.00 B/s    2.97 K/s  0.00 %  0.00 % java -Djava.util.logging.config.fil~che.catalina.startup.Bootstrap start
16289 be/4 root        0.00 B/s    2.97 K/s  0.00 %  0.00 % java -Djava.util.logging.config.fil~che.catalina.startup.Bootstrap start


其中TID为线程id,可以通过jstack -l 进程号  把线程信息dump出来,,,,然后就知道是哪个线程占用io比较高

"http-10.132.23.74-8090-exec-54" daemon prio=10 tid=0x00002aab36ecec00
 nid=0x3175 waiting on condition [0x00000000498c0000..0x00000000498c0e20]


    java.lang.Thread.State: TIMED_WAITING (parking)


     at sun.misc.Unsafe.park(Native Method)


     - parking to wait for  <0x00002aaaba3cf768> (a
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
     at
 java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)at


java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:1963)at


java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:395)at


java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:944) at


java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:906)
 at java.lang.Thread.run(Thread.java:619)

不停的比对(一两次搞不出来,,多搞几次就可以看出来了),,,最终可以定位到 写语音文件的线程,,,,写的是网络磁盘


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在STM32微控制器中,我们可以使用寄存器操作来一次性给多个IO口赋值。首先,我们需要找到对应的GPIO端口控制寄存器。每一个GPIO端口都有一个独立的寄存器用于控制其相应的IO口。 假设我们要同时给PA0、PA1和PA2这三个IO口赋值,我们可以通过修改GPIOA的寄存器来实现。GPIOA的寄存器地址通常为0x4002 0000,并根据芯片型号可能会有所不同。 首先,我们需要设置GPIOA的模式为输出模式,即将GPIOA的模式寄存器(GPIOx_MODER)的低6位设置为二进制值“01”,代表输出模式。假设GPIOA_MODER的地址为0x4002 0000。 ``` (*(unsigned int *)(0x40020000)) = (*(unsigned int *)(0x40020000)) | 0x00000015; //设置GPIOA_MODER低6位为“01”; ``` 接下来,我们需要给PA0、PA1和PA2分别赋予相应的值。STM32的IO口寄存器名为GPIOx_BSRR(x代表相应的端口号)。 ``` (*(unsigned int *)(0x40020018)) = 0x00000007; //将GPIOA_BSRR低3位设置为“111”; ``` 通过以上操作,我们就在一次操作中给PA0、PA1和PA2这三个IO口同时赋予了值。赋值的值为二进制的“111”,即高电平。 需要注意的是,上述示例是基于直接访问寄存器的方法实现的。实际的开发中,推荐使用STM32提供的HAL库或者直接使用寄存器映射的寄存器宏定义来进行IO口的操作,以保证代码的可读性和可维护性。 ### 回答2: 对于STM32微控制器,要一次性给多个IO口赋值,可以使用位带操作或者直接使用寄存器操作。 一种方法是使用位带操作,可以通过位带别名区域来操作IO口。首先,需要定义IO口组的别名指针,将其指向特定的IO组。然后,可以通过对该指针进行赋值操作,实现一次性给多个IO口赋值。具体步骤如下: 1. 定义位带别名指针: ```c #define IO_PORT_A *((volatile unsigned long*) 0x42000000) #define IO_PORT_B *((volatile unsigned long*) 0x42000020) ... ``` 2. 将别名指针指向特定的IO组,例如将别名指针指向A组的8个IO口: ```c volatile unsigned long *portA = &IO_PORT_A; ``` 3. 通过对别名指针进行赋值操作,实现一次性给多个IO口赋值: ```c *portA = 0x55; // 给A组的8个IO口赋值为0x55 ``` 另一种方法是直接使用寄存器操作,可以通过直接对寄存器进行赋值操作来实现一次性给多个IO口赋值。具体步骤如下: 1. 找到要操作的寄存器地址,例如GPIOA的数据寄存器地址为0x40020014。 2. 将希望赋值的数据存储到一个变量中,以便后续使用。 3. 将数据赋值给待操作的寄存器地址: ```c *((unsigned long*) 0x40020014) = data; // 给GPIOA的数据寄存器赋值data ``` 以上就是一次性给多个IO口赋值的两种方法。通过位带操作或者直接使用寄存器,我们可以灵活地操作STM32的IO口,并且提高IO口赋值的效率。 ### 回答3: 在STM32系列的微控制器中,可以通过寄存器操作一次性给多个IO口赋值。每个IO口都有对应的寄存器来控制其电平状态。通常,每个IO口都有一个对应的寄存器组,包含GPIOx_BSRR(端口置位寄存器)和GPIOx_BRR(端口复位寄存器),其中x表示端口号。 要一次性给多个IO口赋值,可以通过写入GPIOx_BSRR寄存器来实现。为了同时置位或复位多个IO口,我们可以设置该寄存器的相应位,每个位对应一个IO口。其中,1表示置位(高电平),0表示复位(低电平)。 例如,如果我们要一次性将PA0、PA1和PA2口置位(设置为高电平),可以使用以下代码: GPIOA->BSRR = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; 同样地,如果我们要一次性将PB0和PB1口复位(设置为低电平),可以使用以下代码: GPIOB->BSRR = GPIO_PIN_0 | GPIO_PIN_1 << 16; 通过这种方法,可以一次性给多个IO口赋值,提高了IO口的操作效率。需要注意的是,要在代码中正确配置相应的GPIO寄存器和引脚,确保选中了正确的端口和引脚号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值