내 html-scraper에 문제가 있습니다. Html-scraper는 HtmlUnit을 사용하여 Java로 작성된 멀티 스레딩 응용 프로그램입니다. 기본적으로 128 개의 스레드로 실행됩니다. 즉, 그것은 다음과 같이 작동합니다 : 큰 텍스트 파일, ping url에서 사이트 URL을 가져 와서 액세스 할 수 있는지 - 사이트를 구문 분석하고, 특정 HTML 블록을 찾고, HTML 코드를 포함한 모든 URL 및 블록 정보를 데이터베이스의 해당 테이블에 저장하고로 이동합니다. 다음 사이트. 데이터베이스는 mysql 5.1, InnoDb 테이블 4 개, 뷰 4 개가있다. 테이블에는 테이블 조인에 사용되는 필드에 대한 숫자 인덱스가 있습니다. 또한 CodeIgniter에 쓰여진 구문 분석 된 데이터를 검색하고 검색 할 수있는 웹 인터페이스가 있습니다 (델타 인덱스를 사용하여 스핑크스를 검색 할 수 있습니다).Java-mysql 고부하 응용 프로그램 충돌이 발생했습니다.
서버 구성 :
CPU: Type Xeon Quad Core X3440 2.53GHz
RAM: 4 GB
HDD: 1TB SATA
OS: Ubuntu Server 10.04
일부 MySQL의 설정 :
key_buffer = 256M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 128
max_connections = 400
table_cache = 64
query_cache_limit = 2M
query_cache_size = 128M
다음 옵션을 제외한 기본 매개 변수와
자바 머신 실행 : 데이터베이스, 스크레이퍼 과정 (18 개)의 URL에서 비어
-Xms1024m -Xmx1536m -XX:-UseGCOverheadLimit -XX:NewSize=500m -XX:MaxNewSize=500m -XX:SurvivorRatio=6 -XX:PermSize=128M -XX:MaxPermSize=128m -XX:ErrorFile=/var/log/java/hs_err_pid_%p.log
초 그리고 충분히 안정되었다. 그러나 urls 테이블에 384929 개의 레코드 (처리 된 전체 URL의 25 %)가 포함되어 있고 8.2Gb가 소요되는 2 개의 약한 작업 후에는 Java 응용 프로그램이 매우 느리게 시작되고 1 ~ 2 분마다 중단됩니다. 그 이유는 mysql은 증가하는 로딩을 처리 할 수 없다는 것입니다 (파서는 2+4*BLOCK_NUMBER
처리 된 모든 쿼리를 쿼리하고, 매 10 분마다 델타 인덱스를 업데이트하는 스핑크스이지만 한 사람 만 사용하기 때문에 웹 인터페이스를 고려하지 않습니다.)), 아마도 인덱스를 매우 천천히 다시 작성합니까? 그러나 mysql 및 scraper 로그 (발견되지 않은 모든 예외도 포함)는 비어 있습니다. 당신이 그것에 대해 어떻게 생각하십니까?
충돌에 대해 자세히 설명해 주시겠습니까? JVM 크래시입니까, 아니면 OutOfMemoryError와 같은 오류가 발생하고 있습니까? 응용 프로그램의 메모리 프로파일 링을 시도 했습니까? 아니면 최대 메모리를 늘리셨습니까? –
OutOfMemoryError 예외는 아니며 몇 분 안에 자동 종료됩니다 (어쩌면 mysql로 인해). 현재 웹 인터페이스가 응답하지 않으면 SQL 쿼리는 매우 느리게 수행됩니다 (300 초 이상). 나는 최대 메모리를 증가하려고하지만, 도움이되지 않습니다 – c1tru55