Acerca de sintonía entorno Linux (Tomcat)

prefacio

En primer lugar usted necesita saber la memoria y de la CPU del servidor. A continuación, establezca el medio ambiente Dependiendo de la configuración del servidor relacionados con Java. Usted puede ver y uso de cada proceso

 

de comandos relacionados con Linux

comando free - Memoria (alto mando también puede mostrar el uso de memoria, pero no se puede establecer unidades)

memoria de visualización de comandos libre de uso del sistema y de reposo , incluyendo la memoria física, la memoria interacción zona (swap) y la memoria tampón de kernel.

comando nota
gratis Muestra en Kb de memoria
libre -m Muestra en la memoria Mb
libre -g Muestra han sido Gb de memoria

En función de las unidades de visualización del sistema se muestran a continuación:

Parámetros de la siguiente manera:

  • Mem: representa las estadísticas memoria física, la memoria restante si la máquina es muy pequeño, típicamente menos de 20% de la memoria total, se determina que el sistema no es suficiente memoria física
  • Swap: indica el uso de una partición de intercambio en el disco duro, tales como el pequeño espacio que queda, las necesidades del sistema a prestar atención al uso de la carga y la memoria actual, cuando el valor de la permuta utilizado es mayor que 0, entonces el sistema operativo no es suficiente memoria física, memoria del disco duro ha comenzado a utilizar el .
  • Total: representa las estadísticas de memoria física
  • usada: representa el total asignado a (incluir tampones y caché) el número de utilizado, pero en realidad puede no utilizar la caché parcial
  • libre: representa la memoria no asignada
  • compartida: la representación compartida de memoria
  • buff / cache: representa el número de buffers asignados pero no utilizados del sistema
  • disponibles: representa el número de sistema disponible asignado pero no utilizado

 

        Compruebe la memoria del sistema para cada porcentaje de rosca de los casos: (por encima de ejecutar el comando para ver la situación de cada uso de la memoria proceso de la memoria del programa, como se muestra a continuación, la primera columna es el porcentaje de memoria ocupada por el proceso, las aplicaciones que representaban la memoria puede verse más por la solución de problemas)

# 如下的命令感觉比Top要好点,可以看执行命令的全路径,这样就比简写要好点.

ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less


 

Muestra el siguiente contenido introduzca el comando:

  • % MEM: memoria representa el porcentaje ocupado por el proceso de
  • % CPU: CPU representa el porcentaje ocupado por el proceso de

 

Top comando - incluyendo el uso de memoria, la taza, el proceso de

la parte superior de comandos para ver el sistema de carga en tiempo real, incluyendo procesos, carga de CPU, uso de memoria, y así sucesivamente;

entrada superior comandos directamente, se puede ver la información como se muestra abajo en la que la mitad superior de la utilización de la memoria, el siguiente proceso es el uso de la persona.

 

La mitad superior - esto también es parte muy importante de la sensación

Como la mitad superior de la Fig.% De la CPU la parte principal inferior cuando el significado de los parámetros. La siguiente sección está libre del comentario libre por encima puede verse

 

  • nosotros: el espacio de usuario ocupado por el porcentaje de CPU
  • SY: el espacio del núcleo ocupado por el porcentaje de CPU
  • ni: procesos de prioridad dentro del espacio de proceso de usuario ocupado por el porcentaje de CPU cambiaron
  • ID: porcentaje de inactividad de la CPU
  • wa: porcentaje de tiempo de CPU de espera para la salida de entrada
  • hola: servicios de hardware de la CPU en el tiempo total que se necesita para romper
  • SI: CPU tiempo total de servicio de interrupción suave pasó
  • ST: Steal tiempo si se desea implementar un entorno virtual (por ejemplo: Amazon EC2) roba el tiempo es uno de los indicadores de rendimiento que desea seguir. Si el valor de este indicador es alto, entonces ese estado de la máquina es muy mala

 

La mitad inferior - esta es la parte más fácil

  • PID: identificador de proceso
  • Usuario: propietario del proceso
  • PR: Prioridad
  • NI: buen valor, un valor negativo indica una alta prioridad y baja prioridad en posición vertical
  • VIRT: cantidad total de memoria virtual utilizada por el proceso de
  • RES: proceso utilizado, no cambiados de tamaño de la memoria física
  • SHR: tamaño de memoria compartida
  • S: Situación del proceso
  • % CPU: la última actualización del porcentaje de ocupación actual de tiempo de CPU
  • % MEM: El porcentaje de memoria física utilizada por el proceso de
  • TIEMPO +: El tiempo total de CPU utilizado por el proceso de
  • COMANDO: nombre del comando, la línea de comandos

Otro comando top

       Después de entrar en la parte superior de la interfaz en tiempo real, clasificación predeterminado de acuerdo con el uso de CPU por el botón "shift + m" para proceso de clasificación de acuerdo con el uso de la memoria , se puede ver qué procesos se encuentran actualmente en la memoria del sistema por encima de la "grande".

       superior orden, pulse f llave para entrar en la interfaz de selección de columna de clasificación, puede seleccionar dónde mostrar la columna, la columna debe ordenarse de acuerdo con lo que otra información, descrita con referencia a elegir si desea mostrar el cuadro rojo esa línea columna, el superíndice * se visualiza

 

El número de núcleos y el número de CUP cpu

  Tenga en cuenta que el valor predeterminado de Netty funciona dos veces el número de núcleos, o intensivos dos veces el número de núcleos, el número de computacionalmente intensivos núcleo 1 veces, para evitar la sobrecarga de un cambio de contexto hilo.

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数 
# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数


# 查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l


# 查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq


# 查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l

 

Tomcat parámetro de optimización

 

\ bin \ JAVA_OPTS conjunto catalina.sh

Antes catalina.sh de cygwin = false frase más JAVA_OPTS

JDK 1.8 en PermSize y MaxPermGen deja de ser válida. JDK 1.8 Conclusión generación ha reemplazado permanentemente por el metaespacio ausencia.

Como se muestra en el siguiente ejemplo:

JAVA_OPTS="$JAVA_OPTS -server -Xms2048M -Xmx3072M -Xss1024k
-XX:+AggressiveOpts
-XX:+UseParallelGC -XX:+UseBiasedLocking"

 

  • -server:    Asegúrese de que el primer argumento, el mejor rendimiento cuando múltiples CPU, hay un modo llamado -client, que se caracteriza por un inicio más rápido, pero el rendimiento en tiempo de ejecución y la eficiencia de la gestión de memoria no es muy alta, por lo general para los clientes desarrollo de aplicaciones finales o depuración, situado en el entorno de programación Java de 32 bits está habilitado por defecto en este modo. Características modo de servidor es comenzar más lentamente, pero es un alto rendimiento en tiempo de ejecución y la gestión de memoria eficiencia, adecuado para un entorno de producción, este modo está activado por defecto en el entorno JDK con capacidad de 64 bits, no se puede configurar los parámetros.

  • -Xms:   Para inicializar la memoria, la memoria máxima directa y constante, para evitar la asignación de memoria repetida, lo que reduce la eficiencia de una hasta directa es la más grande, también JVM no tienen memoria extendida, y ahorrar tiempo.

  • -Xmx:   indica el tamaño máximo de Java montón, cuando las necesidades de las aplicaciones de la memoria de almacenamiento dinámico más allá del valor máximo de la máquina virtual tendrán aplicaciones de desbordamiento de la memoria y la causa inmediatas para bloquear el servicio,en general se recomienda que el montón máxima se establece en el máximo de memoria disponible 80% (también decir la mitad de la memoria física). ¿Cómo sé que puedo utilizar la JVM máxima de uso de Java Xmx512M -versión mando a prueba, y luego aumentar gradualmente el valor de 512, si se ejecuta correctamente, significa una cantidad especificada de memoria disponible,de lo contrario, se imprimirá un mensaje de error,el valor por defecto 1/4 de la memoria física, el valor predeterminado (parámetros MinHeapFreeRatio puede ajustarse) de más de 70% de montón de memoria libre, la JVM reducirá el límite mínimo de la pila hasta -Xms.
  • : -Xmn   tamaño de la memoria de la nueva generación, Nota: El tamaño es aquí (eden + 2 espacio de supervivencia). Y jmap -heap Nueva generación está representada es diferente. Todo el nuevo tamaño de generación montón = tamaño + tamaño + generaciones permanentes tamaño antigua generación. En el caso del mismo tamaño para garantizar que el montón, se incrementa la nueva generación, se reducirá el tamaño de la vieja generación  (Este impacto valor mayor en el rendimiento del sistema, Sun configuración recomendada oficialmente para todo el montón 3/8. 3 y 4 generalmente se establece en uno de los puntos Xmx)
  • -Xss:    es la memoria ocupada por cada hilo, es decir, cada tamaño de la pila hilo, fácil de desborde demasiado pequeño, demasiado grande dará lugar a una reducción del número de hilos creados porque la capacidad máxima está limitada. Aquí máximo 1280m memoria, puede crear teóricamente un hilo alrededor de 1000, casi 500 soporta el acceso concurrente (acceso concurrente Oh, que es, al mismo tiempo el usuario hace clic 500), ha sido bastante ella. Significa que cada Java tamaño de la pila hilo, JDK 5.0 después de cada tamaño de la pila hilo se 1M, antes de cada tamaño de la pila hilo es de 256K. Dependiendo de las hebras de la aplicación para ajustar el tamaño de la memoria requerida en la misma memoria física, reduciendo este valor puede generar más hilos, pero el sistema operativo en el número de hilos dentro de un proceso todavía limitada, no la generación ilimitada, experiencia en aproximadamente 3.000 a 5.000. Generalmente pequeña aplicación, si la pila no es muy profunda, debería ser suficiente para 128k, 256k recomendado para grandes aplicaciones o 512K, son generalmente fáciles de instalar más de 1 M, o de lo contrario cabo ofmemory propensos. Esta opción es relativamente grande impacto en el rendimiento requiere pruebas rigurosas.

  • -XX: + AggressiveOpts:   el papel de su nombre (agresivo), este parámetro está activado, cada vez que la versión JDK actualizar su JVM utilizar técnicas de optimización (en su caso) la última adición.
  • -XX: + UseParallelGC:   colector dispuestos paralelos. Esta configuración es válida sólo para la generación joven. Que el colector paralelo generación joven, sin dejar de utilizar la vieja generación del colector de serie.
  • -XX: + UseBiasedLocking: habilitar un bloqueo optimizado el hilo,sabemos que en nuestro servidor de aplicaciones, cada solicitud HTTP es un hilo, algunos cortos y otros petición petición de largo, habrá solicitudes en cola fenómeno, o incluso aparecen hilo se bloquea, el bloqueo de rosca optimizada permite el despliegue óptimo de enhebrado automático dentro de su servidor de aplicaciones.
  • -XX: NewSize: Establecer una nueva generación de tamaño de la memoria.
  • -XX: MaxNewSize: establecer el tamaño máximo de la nueva generación de la nueva generación de memoria
  • -XX: PermSize: ajustar el tamaño de la memoria permanente generación.
  • -XX: MaxPermSize: establecer el tamaño máximo de la memoria permanente generación, no pertenece a la generación permanente de la pila de memoria, la memoria de pila contiene sólo la nueva generación y la vieja era.

 

Mediante el establecimiento de un aspa si el inicio de Tomcat

  • 1. En primer lugar, conf / tomcat-users.xml archivo dentro, añada el siguiente código frente a los </ tomcat-users>
<role rolename="manager-gui"/>  

# username就是登陆账号 password就是密码

<user password="admin" roles="manager-gui" username="tomcat"/>  
  • 2. Modificar / webapps / gerente / el directorio de archivo META-INF / context.xml, de la siguiente manera:

<Valve className="org.apache.catalina.valves.RemoteAddrValve"  
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|\d+\.\d+\.\d+\.\d+" />  

  • 4. Comprobar confirmó la memoria asignada

 

 

 

./conf/server.xml sintonización

 

La agrupación de conexiones

Abrir configuración de agrupación de conexiones por defecto anotado, y el siguiente cambio

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"  
         maxThreads="150" 
         minSpareThreads="100"   
         prestartminSpareThreads="true" 
         maxQueueSize="100"/>   
  • Nombre: el nombre de la rosca
  • namePrefix: Hilo de prefijo
  • maxThreads: El número máximo de conexiones simultáneas, configure el valor predeterminado 200 generalmente no se recomienda el establecimiento de 500 a 800, de acuerdo con sus instalaciones de hardware y las necesidades reales de negocio.
  • MinSpareThreads: Tomcat Temas inicializan, el valor por defecto de 25   
  • prestartminSpareThreads: Tomcat en las MinSpareThreads valor de inicialización de inicialización cuando no está en el valor conjunto de efectos trueminSpareThreads nada.
  • maxQueueSize: número máximo de cola, excede la solicitud es rechazada

Configuración de la conexión

Y modificar la configuración del enlace cambiado a lo siguiente:

<Connector port="8080" protocol="HTTP/1.1"  
        connectionTimeout="20000"  
        redirectPort="8443"    
        executor="tomcatThreadPool"  
        enableLookups="false"   
        maxIdleTime="60000"
        acceptCount="100"   
        maxPostSize="10485760" 
        acceptorThreadCount="2"    
        disableUploadTimeout="true"   
        URIEncoding="utf-8"
        keepAliveTimeout ="6000"  
        maxKeppAliveRequests="500"  />  
  • Puerto: puerto.  
  • Protocolo: se utiliza el conector de transmisión.  
  • ejecutor: el nombre del grupo de subprocesos que utiliza el conector
  • enableLookups: Deshabilitar consultas DNS
  • MaxIdleTime: Hilo de tiempo de inactividad, después de este tiempo, el subproceso inactivo será destruido, el valor predeterminado es de 6000 (un minuto), en milisegundos.
  • acceptCount: Especifica solicitud de procesamiento puede usarse cuando se utilizan todos los hilos, el número de solicitudes puede ser colocado en el proceso de cola, más que no se procesará el número de la solicitud, la configuración predeterminada 100.
  • MaxPostSize: limitar el tamaño de contenido, en bytes para publicar FORM URL de solicitud parámetro realización, el valor predeterminado es 2097152 (2 megabytes), 10.485.760 a 10M. Si desea desactivar el límite, se puede establecer a -1.
  • acceptorThreadCount: recibir un número de hilos para la conexión, el valor predeterminado es 1. Esto significa generalmente cuando el cambio es necesario porque el servidor es una CPU de varios núcleos, si está configurado como una CPU multinúcleo general 2.
  • disableUploadTimeOut: Permitir contenedor Servlet, se realiza usando un valor de tiempo de espera de conexión más largo, así Servlet tiempo más largo para completar su ejecución, el valor predeterminado es falso
  • KeepAliveTimeout - expresó antes de que llegara la siguiente petición, Tomcat cuánto tiempo se debe mantener la conexión. Esto significa que si las peticiones de los clientes se han registrado más, y no exceder de la fecha de caducidad, la conexión se mantendrán.
  • MaxKeepAliveRequests - indica el número máximo de solicitudes soportados por la conexión. El número de solicitudes que excedan la conexión también será cerrada (en este momento devuelve una conexion: cerca de cabecera para el cliente). (MaxKeepAliveRequests = "1" desactiva el uso del conector de largo) (desactivar 1, -1 medios para limitar el número, por defecto 100 generalmente dispuesto entre 100 y 200)

 

Compresión en el gato

      La compresión aumentará la carga en Tomcat, el mejor uso Nginx + Tomcat o Apache + Tomcat manera, la compresión entregado a Nginx / Apache para hacerlo.

      Tomcat se comprime cuando el cliente solicita el recurso de servidor correspondiente, el archivo de recursos de la compresión del lado del servidor, y la salida a continuación al cliente, el navegador del cliente es responsable de la descompresión y la navegación. En relación con la navegación normal HTML, CSS, Javascript y texto, se puede ahorrar alrededor del 40% del tráfico. Más importante aún, dinámicamente puede generado, incluyendo CGI, páginas PHP, JSP, ASP, servlet, SHTML y otro de salida puede ser comprimido, la eficiencia de la compresión también es alta.

 

IO optimización de Tomcat

       Es decir Tomcat conector modificado el modo de funcionamiento, Tomcat conector (conector de la Tomcat) tiene bio, nio, aprtres modos de funcionamiento.

  • BIO:  bloqueo síncrono IO, cada solicitud debe crear un hilo de manejar, hilo sobrecarga es relativamente grande, tomcat7 o menos, en el sistema Linux predeterminada de esta manera. Desventajas: alta concurrencia, gran número de hilos, un desperdicio de recursos.
  • NIO:  asíncrono sin bloqueo IO, S asíncrona en Java puede manejar un gran número de solicitudes procesadas por un pequeño número de hilos, por defecto Tomcat8 de esta manera en el sistema Linux. Tomcat7 debe modificar las propiedades de configuración de conector protocolo para iniciar:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" 
         connectionTimeout="20000" redirectPort="8443"/> 

 

  • TAE:  matanza grande abril, es decir, las bibliotecas portátil en tiempo de ejecución de Apache, desde el nivel del sistema operativo para resolver el ioproblema de bloqueo. aprTomcat se está ejecutando en el modo preferido de aplicaciones altamente concurrentes .Tomcat7 o Tomcat8 iniciar el sistema por defecto Win7 o más de esta manera. Si instala Linux apry native, Tomcat comenzará apoyo directoapr.(这个详细的使用暂时,后面有空在写清楚点[email protected])

 

TCP de Linux

 

 optimización del sistema Linux - el número máximo de conexiones TCP para transferir grandes

   linuxComo un servidor, cuando socketse ejecuta alta concurrente TCPdel programa, por lo general se produce en el establecimiento de la conexión no se puede establecer una conexión con el caso del número determinado entorno de producción después de varias pruebas, cada vez que una conexión se establece a 1000 ya no se encuentra para establecer tcpla conexión, ¿Por qué?

      Esto se debe a Linuxla plataforma, independientemente de escribir el programa cliente o servidor, durante la escuela concurrente TCPproceso de conexión, estará sujeto a un mayor número de usuarios simultáneos en un solo sistema puede procesar simultáneamente límite de archivos abiertos al número ( Esto es debido a que el sistema es cada TCPconexión debe crear un socketmango, cada socketmango es también un identificador de archivo ). Para subir el TCPnúmero máximo de conexiones, se debe modificar el límite de archivos abiertos proceso de usuario.

 

Ver sistema permite limitar el número de archivos en el actual proceso de usuario abierta

ulimit -n 

Esto significa que el proceso actual para cada usuario permite hasta abrir el archivo de 1024, el valor predeterminado es 1024

Modificar /etc/security/limits.confarchivos en el archivo de 最后añadir la siguiente:
 

vim /etc/security/limits.conf

añadir

root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

 

  • El primer argumento especifica modificar rootun límite de apertura de archivos de usuario, utilizando el signo '*' indica que un usuario modifique todas las restricciones;
  • El segundo parámetrosoft , o hardque desea modificar el límite blando o duro límite;
  • El tercer argumento 65535 especifica los nuevos valores límite que desea modificar, que es el número máximo de archivos abiertos (Tenga en cuenta que el valor límite blando es menor o igual al límite duro)  nofilecon un límite superior, no es infinito, nofile 65535 que es un límite superior de 65535

        Puedes volver a lo que se pueden encontrar piezas límite se ha cambiado a: 65535 ( algunos sistemas operativos Linux, tales como (Ubuntu) no permite la configuración *, ubuntu el rootusuario debe escribir, otros usuarios pueden utilizar *en lugar de) la necesidad de reiniciar el sistema para tener efecto.

 

Linux vista a nivel de sistema del número máximo de límite de archivos abiertos, utilice el siguiente comando

Puede ser diferente para cada servidor, un sistema Linux se calcula en base a los recursos de hardware del sistema, como cuando se inicia

cat /proc/sys/fs/file-max   #我的是584864 这个根据服务器硬件计算得出的

Nota : Esto indica que este sistema permite hasta abierta (es decir, que comprende la suma de todo el usuario abre el archivo) de archivos de Linux 95288, el nivel límite estricto sistema Linux, todos los archivos abiertos a nivel de usuario no debe superar el valor límite . Por lo general, este es un sistema Linux límite duro a nivel de sistema en el arranque calculado en base a la mejor situación de los recursos de hardware del sistema, mientras que el número máximo de límite de archivos abiertos, si las necesidades no especiales, no debe modificar este límite, a menos que desee archivos abiertos para las restricciones a nivel de usuario valor de ajuste excede este límite

 

 optimización del sistema Linux TCP / IP del núcleo parámetro de optimización

修改 /etc/sysctl.conf
生效: sysctl -p

net.ipv4.tcp_mem = 196608  262144  393216  
#(4G 内存机器 使用,TCP连接最多约使用1.6GB内存 , 393216*4096/1024/1024=1.6G)
#内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes

net.ipv4.tcp_mem = 524288  699050  1048576  
#(8G 内存使用,TCP连接最多约使用4GB内存)         

#为每个TCP连接分配的读、写缓冲区内存大小,单位是Byte
net.ipv4.tcp_rmem = 4096      8192    4194304
net.ipv4.tcp_wmem = 4096      8192    4194304
#                  最小内存  缺省内存  最大内存
# 一般按照缺省值分配,上面的例子就是读写均为8KB,共16KB
#1.6G 内存服务器, TCP内存能容纳的连接数,约为  1600MB/16KB = 100K = 10万
#4.G TCP内存能容纳的连接数,约为  4000MB/16KB = 250K = 25万

net.core.somaxconn= 4000
#(端口最大的监听队列的长度)
#同时,修改下全局配置
# echo 4000 > /proc/sys/net/core/somaxconn 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128,

net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;

net.ipv4.tcp_fin_timeout = 30
#修改系統默认的 TIMEOUT 时间。

net.ipv4.tcp_keepalive_time = 1200  
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

net.ipv4.ip_local_port_range = 10000 65000  
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。
#(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)

net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默 认为180000,改为5000。

net.ipv4.tcp_max_orphans = 65536
#当orphans达到32768个时,会报Out of socket memory,此时占用内存 32K*64KB=2048MB=2GB
#(每个孤儿socket可占用多达64KB内存),实际可能小一些

net.ipv4.tcp_orphan_retries = 1
#孤儿socket废弃前重试的次数,重负载web服务器建议调小,设置较小的数值,可以有效降低orphans的数量

net.ipv4.tcp_retries2
#活动TCP连接重传次数,超过次数视为掉线,放弃连接。缺省值:15,建议设为 2或者3.

net.ipv4.tcp_synack_retries
#TCP三次握手的syn/ack阶段,重试次数,缺省5,设为2-3

net.core.netdev_max_backlog = 2048
# 网络设备的收发包的队列大小

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Publicado 70 artículos originales · ganado elogios 51 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/cuiyaonan2000/article/details/104695360
Recomendado
Clasificación